首页 > 编程语言 >php 多图片下载

php 多图片下载

时间:2023-11-22 20:11:55浏览次数:37  
标签:fr x00 cdrec image 图片下载 file php pack

 

参考链接 :https://www.cnblogs.com/sanplit/p/6483432.html
 
public function downAllImageQrcode(){
$data = QrcodeProductImage::field(['id','image'])->where('is_delete','0')->select()->toArray();
foreach ($data as $k=>$v){
if($v['image']){
$image = explode('?',$v['image'])[0];
$image_data[]= [
'image_src'=>$image,
'image_name'=>$v['id'].'.png'
];
}
}
imageDownAll($image_data);
return $this->renderSuccess('下载成功');
}
 
 
 

// 图片打包下载
function imageDownAll(array $image_data)
{
$dfile = tempnam('/tmp', 'tmp');//产生一个临时文件,用于缓存下载文件
$zip = new ZipFile();
$filename = date('Y-m-d h:i:s').'-'.'image.zip'; //下载的默认文件名$filename = iconv("UTF-8", "GBK", $filename);//以下是需要下载的图片数组信息,将需要下载的图片信息转化为类似即可

$image = $image_data;

// 不进行证书验证
$stream_opts = [
"ssl" => [
"verify_peer"=>false,
"verify_peer_name"=>false,
]
];
foreach ($image as $v) {
$zip->add_file(file_get_contents($v['image_src'],false,stream_context_create($stream_opts)), $v['image_name']);
// 添加打包的图片,第一个参数是图片内容,第二个参数是压缩包里面的显示的名称, 可包含路径
// 或是想打包整个目录 用 $zip->add_path($image_path);
}
// 下载文件
//----------------------
$zip->output($dfile);
ob_clean();
header('Pragma: public');
header('Last-Modified:' . gmdate('D, d M Y H:i:s') . 'GMT');
header('Cache-Control:no-store, no-cache, must-revalidate');
header('Cache-Control:pre-check=0, post-check=0, max-age=0');
header('Content-Transfer-Encoding:binary');
header('Content-Encoding:none');
header('Content-type:multipart/form-data');
header('Content-Disposition:attachment; filename="' . $filename . '"'); //设置下载的默认文件名
header('Content-length:' . filesize($dfile));
$fp = fopen($dfile, 'r');
while (connection_status() == 0 && $buf = @fread($fp, 8192)) {
echo $buf;
}
fclose($fp);
@unlink($dfile);
@flush();
@ob_flush();
}
 
 
function getSSLPage($url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSLVERSION,3);
$result = curl_exec($ch);
curl_close($ch);
return $result;
}
 
 
 
 
 
 
 
class ZipFile {
var $datasec = array ();
var $ctrl_dir = array ();
var $eof_ctrl_dir = "\x50\x4b\x05\x06\x00\x00\x00\x00";
var $old_offset = 0;

function unix2_dostime($unixtime = 0){
$timearray = ($unixtime == 0) ? getdate () : getdate($unixtime);
if ($timearray ['year'] < 1980){
$timearray ['year'] = 1980;
$timearray ['mon'] = 1;
$timearray ['mday'] = 1;
$timearray ['hours'] = 0;
$timearray ['minutes'] = 0;
$timearray ['seconds'] = 0;
}
return (($timearray ['year'] - 1980) << 25) | ($timearray ['mon'] << 21) | ($timearray ['mday'] << 16) | ($timearray ['hours'] << 11) | ($timearray ['minutes'] << 5) | ($timearray ['seconds'] >> 1);
}
function add_file($data, $name, $time = 0){
$name = str_replace('\\', '/', $name);

$dtime = dechex($this->unix2_dostime($time));
$hexdtime = '\x' . $dtime [6] . $dtime [7] . '\x' . $dtime [4] . $dtime [5] . '\x' . $dtime [2] . $dtime [3] . '\x' . $dtime [0] . $dtime [1];
eval('$hexdtime = "' . $hexdtime . '";');

$fr = "\x50\x4b\x03\x04";
$fr .= "\x14\x00";
$fr .= "\x00\x00";
$fr .= "\x08\x00";
$fr .= $hexdtime;

$unc_len = strlen($data);
$crc = crc32($data);
$zdata = gzcompress($data);
$zdata = substr(substr($zdata, 0, strlen($zdata)- 4), 2);
$c_len = strlen($zdata);
$fr .= pack('V', $crc);
$fr .= pack('V', $c_len);
$fr .= pack('V', $unc_len);
$fr .= pack('v', strlen($name));
$fr .= pack('v', 0);
$fr .= $name;

$fr .= $zdata;
$fr .= pack('V', $crc);
$fr .= pack('V', $c_len);
$fr .= pack('V', $unc_len);

$this->datasec [] = $fr;

$cdrec = "\x50\x4b\x01\x02";
$cdrec .= "\x00\x00";
$cdrec .= "\x14\x00";
$cdrec .= "\x00\x00";
$cdrec .= "\x08\x00";
$cdrec .= $hexdtime;
$cdrec .= pack('V', $crc);
$cdrec .= pack('V', $c_len);
$cdrec .= pack('V', $unc_len);
$cdrec .= pack('v', strlen($name));
$cdrec .= pack('v', 0);
$cdrec .= pack('v', 0);
$cdrec .= pack('v', 0);
$cdrec .= pack('v', 0);
$cdrec .= pack('V', 32);

$cdrec .= pack('V', $this->old_offset);
$this->old_offset += strlen($fr);

$cdrec .= $name;

$this->ctrl_dir[] = $cdrec;
}

function add_path($path, $l = 0){
$d = @opendir($path);
$l = $l > 0 ? $l : strlen($path) + 1;
while($v = @readdir($d)){
if($v == '.' || $v == '..'){
continue;
}
$v = $path . '/' . $v;
if(is_dir($v)){
$this->add_path($v, $l);
} else {
$this->add_file(file_get_contents($v), substr($v, $l));
}
}
}
function file(){
$data = implode('', $this->datasec);
$ctrldir = implode('', $this->ctrl_dir);
return $data . $ctrldir . $this->eof_ctrl_dir . pack('v', sizeof($this->ctrl_dir)) . pack('v', sizeof($this->ctrl_dir)) . pack('V', strlen($ctrldir)) . pack('V', strlen($data)) . "\x00\x00";
}

function add_files($files){
foreach($files as $file){
if (is_file($file)){
$data = implode("", file($file));
$this->add_file($data, $file);
}
}
}
function output($file){
$fp = fopen($file, "w");
fwrite($fp, $this->file ());
fclose($fp);
}
}
 
 
参考链接 :https://www.cnblogs.com/sanplit/p/6483432.html
 
 
 
 
 
 
 
 
 
 
 
 

 

标签:fr,x00,cdrec,image,图片下载,file,php,pack
From: https://www.cnblogs.com/abcdefghi123/p/17850173.html

相关文章

  • Docker部署phpMyAdmin
    一、简介phpMyAdmin是众多MySQL图形化管理工具中使用最为广泛的一种,是一款使用PHP开发的基于B/S模式的MySQL客户端软件,该工具是基于Web跨平台的管理程序,并且支持简体中文,用户可以在官网上下载最新版本的。phpMyAdmin为Web开发人员提供了类似Access,SQLServer的图形化......
  • php压缩json数据
    最近在优化一个页面:ajax请求异步数据,特定情况下,json数据达到100MB左右,仅数据传输时间就需要10-20s左右,简直太慢了。检索资料看怎么压缩json数据有效的方法:ob_start('ob_gzhandler');//压缩数据header('Content-Type:application/json');$data=[];for($i=0;$i<10......
  • 如何在 PHP 中使用 while 循环按 ID 列出节中的数据?
    要在PHP中使用while循环按ID列出数据,您可以按照以下步骤进行操作:创建数据库连接:首先,您需要使用适当的凭据来连接到数据库。您可以使用mysqli或PDO等库来实现数据库连接。$servername="localhost";$username="your_username";$password="your_password";$dbname......
  • phpstudy无法启动MySQL服务的解决方案
        MySQL这个服务,一直启动不了,原因是phpstudy里的MySQL服务与本地的MySQL占用的都是3306端口,产生了冲突。   在不想卸载好不容易在本地安装的MySQL服务,那么就可以采用以下办法解决服务冲突:        首先按下win+R执行services.msc进入服务,查找到M......
  • php提前返回数据,后面代码继续执行封装函数
    /*中断并返回数据,后面程序继续执行,避免用户等待(immediate)*可用于返回值后,继续执行程序,但程序占得所以自由没有释放,一致占用,务必注意,最好给单独脚本执行*@paramstring|array$data字符串或数组,数组将被转换成json字符串*@paramintval$set_ti......
  • 如何在 PHP 中使用 while 循环按 ID 列出节中的数据?
    要在PHP中使用while循环按ID列出数据库中的数据,您需要遵循以下步骤:创建数据库连接:首先,您需要使用适当的凭据来连接到数据库。您可以使用mysqli或PDO等库来实现数据库连接。$dbHost='localhost';$dbUsername='your_username';$dbPassword='your_password';$dbNam......
  • PHP调用java的jar包方法
    制作创建测试的jar包打开idea,文件->新建项目->java模块->选择SDK->项目名称为calcutil在src中新建名为Calc.java,内容如下publicclassCalc{publicstaticintadd(inta,intb){returna+b;}}配置工件:文件->项目结构->工件->添加->jar......
  • PHP 国密SM2 私钥公钥计算公式
      在线测试地址1.私钥可查询出公钥;公钥无法计算私钥,注意保护私钥安全;2.分割字符串:PHP函数substr($str,36|76);3.HEX转base64:PHP函数base64_encode(hex2bin());4.base64转HEX:PHP函数bin2hex(base64_decode());5.公钥HEX转PEM证书:字符串'3059301306072a8648ce3d02......
  • [CTF/Web] PHP 反序列化学习笔记
    Serialize&unserialize这两个方法为PHP中的方法,参见serialize和unserialize的官方文档.以下内容中可能存在字段,属性,成员三个名词误用/混用,但基本都表示属性文章仍在完善之中,SESSION反序列化漏洞要学废了入门我们先看看方法的序列化之后的字符串的......
  • php_mysql: dlt - 数据库操作
    php_mysql:  dlt-数据库操作    一、数据库的建立和数据插入 1、数据库建立1DROPDATABASE`tmp`;234CREATEDATABASEIFNOTEXISTS`tmp`;567USEtmp;8910CREATETABLEIFNOTEXISTS`dlt2023`(11`uid`INTNOTNU......