PHP多个图片压缩成ZIP的方法


Posted in PHP onAugust 18, 2020

本文实例为大家分享了PHP多个图片压缩成ZIP的具体代码,供大家参考,具体内容如下

可将多个文件压缩成一个zip压缩包,文件名可自定义(兼容中文文件名)

<?php
header("Content-type: text/html; charset=utf-8"); 
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 = urldecode($name);   
 //判断文件名中是否含有中文
 if (preg_match("/[\x7f-\xff]/", $name)) { 
 $name = $this->iconv_to_utf8($name,'GB2312');
 }
 
  $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);
 }

 /**
 * 转码为UTF-8
 * @param $keyword 要转码的字符串
 */
 function iconv_to_utf8($keyword, $to='UTF-8'){
 $encode = mb_detect_encoding($keyword, array('ASCII','UTF-8','GBK','GB2312'));
 if($encode != $to){
 $keyword = iconv($encode, $to, $keyword);
 }
 return $keyword;
 }


}

$dfile = tempnam('/tmp', 'tmp');//产生一个临时文件,用于缓存下载文件
$zip = new zipfile();

 


//----------------------
$filename = 'image.zip'; //下载的默认文件名
$filename = $filename;
$host = 'http://test.love11.com';
//$dir_name = $host.'/images/point_qrcode/';
$image = array(
 array('image_src' => 'test2.jpg', 'image_name' => '中文1.jpg'),
 array('image_src' => 'weixin.jpg', 'image_name' => '中文2.jpg'),
);

foreach($image as $v){ 
 $zip->add_file(file_get_contents($dir_name.urlencode($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 相关文章推荐
php利用cookies实现购物车的方法
Dec 10 PHP
php实现兼容2038年后Unix时间戳转换函数
Mar 18 PHP
CentOS下PHP7的编译安装及MySQL的支持和一些常见问题的解决办法
Dec 17 PHP
详解WordPress中分类函数wp_list_categories的使用
Jan 04 PHP
php session的锁和并发
Jan 22 PHP
Yii2中OAuth扩展及QQ互联登录实现方法
May 16 PHP
php操作xml并将其插入数据库的实现方法
Sep 08 PHP
PHP用FTP类上传文件视频等的简单实现方法
Sep 23 PHP
yii2高级应用之自定义组件实现全局使用图片上传功能的方法
Oct 08 PHP
yii2使用gridView实现下拉列表筛选数据
Apr 10 PHP
PHP实现批量重命名某个文件夹下所有文件的方法
Sep 04 PHP
PHP pthreads v3下的Volatile简介与使用方法示例
Feb 21 PHP
PHP上传文件及图片到七牛的方法
Jul 25 #PHP
详解PHP版本兼容之openssl调用参数
Jul 25 #PHP
PHP实现的多维数组去重操作示例
Jul 21 #PHP
php实现生成PDF文件的方法示例【基于FPDF类库】
Jul 21 #PHP
记录Yii2框架开发微信公众号遇到的问题及解决方法
Jul 20 #PHP
ThinkPHP 3使用OSS的方法
Jul 19 #PHP
php命令行写shell实例详解
Jul 19 #PHP
You might like
PHP中的Session对象如何使用
2015/09/25 PHP
JavaScript 提升运行速度之循环篇 译文
2009/08/15 Javascript
jQuery MD5加密实现代码
2010/03/15 Javascript
Colortip基于jquery的信息提示框插件在IE6下面的显示问题修正方法
2010/12/06 Javascript
js操作iframe的一些方法介绍
2013/06/25 Javascript
js返回上一页并刷新的多种实现方法
2014/02/26 Javascript
JQuery 给元素绑定click事件多次执行的解决方法
2014/09/09 Javascript
JavaScript+html5 canvas实现本地截图教程
2020/04/16 Javascript
jQuery 获取多选框的值及多选框中文的函数
2016/05/16 Javascript
js生成随机数(指定范围)的实例代码
2016/07/10 Javascript
使用Math.max,Math.min获取数组中的最值实例
2017/04/25 Javascript
关于在vue-cli中使用微信自动登录和分享的实例
2017/06/22 Javascript
XMLHttpRequest对象_Ajax异步请求重点(推荐)
2017/09/28 Javascript
解决vue props 拿不到值的问题
2018/09/11 Javascript
解决微信小程序防止无法回到主页的问题
2018/09/28 Javascript
微信小程序地图导航功能实现完整源代码附效果图(推荐)
2019/04/28 Javascript
解决layer图标icon不加载的问题
2019/09/04 Javascript
[00:56]2014DOTA2国际邀请赛 DK、iG 赛前探访
2014/07/10 DOTA
Python编程中使用Pillow来处理图像的基础教程
2015/11/20 Python
Python打开文件,将list、numpy数组内容写入txt文件中的方法
2018/10/26 Python
python设定并获取socket超时时间的方法
2019/01/12 Python
python按比例随机切分数据的实现
2019/07/11 Python
基于Python的ModbusTCP客户端实现详解
2019/07/13 Python
Python argparse模块应用实例解析
2019/11/15 Python
python 解压、复制、删除 文件的实例代码
2020/02/26 Python
python logging通过json文件配置的步骤
2020/04/27 Python
浅谈keras中的目标函数和优化函数MSE用法
2020/06/10 Python
基于Python-Pycharm实现的猴子摘桃小游戏(源代码)
2021/02/20 Python
2015年医院工作总结范文
2015/04/09 职场文书
党员进社区活动总结
2015/05/07 职场文书
2015年医院后勤工作总结
2015/05/20 职场文书
php 解析非标准json、非规范json
2021/04/01 PHP
javascript Number 与 Math对象的介绍
2021/11/17 Javascript
基于Pygame实现简单的贪吃蛇游戏
2021/12/06 Python
Vertica集成Apache Hudi重磅使用指南
2022/03/31 Servers
Python各协议下socket黏包问题原理
2022/04/12 Python