前天在实现公司一个需求的时候,由于需要提供多图下载的功能,所以想到了多图打包压下载的思路,今天在这里跟大家分享如何实现这个功能。

我们先封装我们的一个压缩打包下载类,代码如下:

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);}
}

完成以上基础类的封装,下面就是调用方法了,代码如下:

//将要下载的图片数组
$image[] = array('image_src' => "图片地址", 'image_name' => "图片命名"
);
//下面是实例操作过程:
$dfile = tempnam('/tmp', 'tmp');//产生一个临时文件,用于缓存下载文件
$zip = new zipfile();
//----------------------
$filename = 'image.zip'; //下载的默认文件名//以下是需要下载的图片数组信息,将需要下载的图片信息转化为类似即可
foreach ($image as $v) {$zip->add_file(file_get_contents($v['image_src']), $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();
exit();

完成以上所有操作,我们便可以成功的进行多图片下载,小伙伴们只要将我的图片数组的数据改成你们要下载的图片的地址跟名字就可以调用了,小伙伴们赶紧试试

更多文章请关注微信公众号

php多图片打包下载相关推荐

  1. javascript实现图片打包下载

    下面是用 JavaScript 实现图片打包下载的方法: 将图片的地址存储到一个数组中. 创建一个新的 ZIP 对象. 使用循环遍历数组中的每个图片地址. 对于每张图片,使用 JSZip.js 库中的 ...

  2. java 下载图片 弹出框_javaweb多图片打包下载,弹出提示框问题_html/css_WEB-ITnose

    fileList = new ArrayList(); String path = request.getSession().getServletContext().getRealPath(" ...

  3. 蔡妍图片打包下载(解压后600多M)

    蔡妍群里以朋友发的,解压后600多M,分类蛮全的,喜欢的就快去下哦,115盘的,居心不良者勿下! http://u.115.com/file/e61xt2ek# 小坏图片.rar 显示的是小坏图片,因 ...

  4. PHP 多个远程图片打包下载

    不多比比. <?php$image1 = "http://mm_img.0-0-2.cn/Img/img/img_2018-07-27_1385_15326602381730.png& ...

  5. 前端打包下载多个图片(ZIP格式)

    前期准备 js库,包括jquery.jszip.FileSaver这三个,可以从网上下载到本地引入,或者直接引用网上的,我这里使用的是后者(以下没有包含jquery,因为本地有). <scrip ...

  6. java生成图片url_Java Springboot如何基于图片生成下载链接

    现有一些图片在服务器上的链接,在浏览器中打开这些链接是直接显示在浏览器页面的形式. 现在需要生成这些图片的单独下载以及打包下载链接,即在浏览器中打开下载链接后弹出下载框提示下载.由于前端存在跨域问题, ...

  7. php 打包下载网络图片,php多张图片打包下载

    * 图片打包下载*/namespace app\common\extend;classImagedown {var $datasec = array();var $ctrl_dir = array() ...

  8. C#.NET快速开发框架-企业版V4.0截图打包下载

    C/S系统开发框架-企业版 V4.0 (Enterprise Edition) http://www.csframework.com/cs-framework-4.0.htm 其它图片打包下载: ht ...

  9. ASP.NET多文件批量打包下载

    在项目实施中,遇到了将多个文件一起打包后,提供给用户下载.如:在一个ASP.NET的开发项目中,通过一个GridView选中对应行数据的CheckBox,就可以实现对选中文件的打包下载了. 在对多文件 ...

  10. 通过jS打包下载图片

    <script src="~/Areas/House/Content/js/HouseInfo/jszip.js"></script> <script ...

最新文章

  1. 开源项目:windows下使用MinGW+msys编译ffmpeg
  2. Office for AI | 拯救互联网人崩溃瞬间
  3. 2018 UESTC 线段树专题
  4. Tomcat配置虚拟路径,使上传文件与服务器及工程文件分离开
  5. 物联网的发展之—Vecloud微云
  6. 【机器学习】如果你不了解机器学习的简史,请看这篇文章
  7. 评价指标:目标检测的评价指标 - mAP
  8. 兼容各种浏览器的自动左右滚动兼左右点击滚动代码
  9. 该文件夹包含名称过长且无法放入回收站的项目_微软复活20年前生产力工具PowerToys,填补Win10缺失功能,开源且免费...
  10. object-c中NSString与int和float的相互转换
  11. 抓包神器之Charles,常用功能都在这里了
  12. dom:原生js使div滚动到最底部
  13. 关于chrome上的网银安全控件开发技术(chrome 调用本地dll)
  14. 《人工智能狂潮》读后感——什么是人工智能?(一)
  15. Mac下epub电子书制作编辑器 : Sigil
  16. 做项目的一些心得体会
  17. 比较好的文档翻译软件-哪个翻译软件最精准
  18. java中高级面试_Java中高级面试题及答案
  19. 区块链网络安全(区块链网络安全论文)
  20. 知识图谱:RDF 或LPG(属性图),您应该选择哪一个?

热门文章

  1. jenkins linux虚拟机,Jenkins实战演练之Linux节点任务配置
  2. Angr安装与使用之使用篇(十一)
  3. HDU-2544-最短路(floyd)
  4. C++STL之整理算法
  5. 清空上传控件HtmlInputFile的方法
  6. 基于sklearn框架实现线性回归,多项式回归和支持向量机的项目实战
  7. Qt QDebug 打印自定义结构体
  8. Qt_编辑器配色方案
  9. 通过cURL获取web页面及http header信息
  10. HashMap原理剖析