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中支持多种编码的中文字符串截取函数!
Mar 20 PHP
常用的php ADODB使用方法集锦
Mar 25 PHP
PHP MSSQL 存储过程的方法
Dec 24 PHP
PHP教程 基本语法
Oct 23 PHP
PHP学习之整理字符串
Apr 17 PHP
php基础学习之变量的使用
Jun 09 PHP
php5.3中连接sqlserver2000的两种方法(com与ODBC)
Dec 29 PHP
PHP cdata 处理(详细介绍)
Jul 05 PHP
利用yahoo汇率接口实现实时汇率转换示例 汇率转换器
Jan 14 PHP
支持中文和其他编码的php截取字符串函数分享(截取中文字符串)
Mar 13 PHP
php中 $$str 中 &quot;$$&quot; 的详解
Jul 06 PHP
php常用字符串查找函数strstr()与strpos()实例分析
Jun 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反转字符串函数strrev()函数的用法
2012/02/04 PHP
IIS安装Apache伪静态插件的具体操作图文
2013/07/01 PHP
使用php判断服务器是否支持Gzip压缩功能
2013/09/24 PHP
php实现统计IP数及在线人数的示例代码
2020/07/22 PHP
利用javascript中的call实现继承
2007/01/22 Javascript
File文件控件,选中文件(图片,flash,视频)即立即预览显示
2009/04/09 Javascript
javascript 函数调用规则
2009/08/26 Javascript
仅用[]()+!等符号就足以实现几乎任意Javascript代码
2010/03/01 Javascript
基于jQuery实现左右图片轮播(原理通用)
2015/12/24 Javascript
基于JavaScript实现瀑布流效果
2017/03/29 Javascript
带你了解session和cookie作用原理区别和用法
2017/08/14 Javascript
详解关于html,css,js三者的加载顺序问题
2019/04/10 Javascript
element中的$confirm的使用
2020/04/26 Javascript
react使用CSS实现react动画功能示例
2020/05/18 Javascript
简单谈谈offsetleft、offsetTop和offsetParent
2020/12/04 Javascript
[15:15]教你分分钟做大人:狙击手
2014/10/30 DOTA
python实现提取百度搜索结果的方法
2015/05/19 Python
Python基本语法经典教程
2016/03/11 Python
R语言 vs Python对比:数据分析哪家强?
2017/11/17 Python
python中几种自动微分库解析
2019/08/29 Python
使用virtualenv创建Python环境及PyQT5环境配置的方法
2019/09/10 Python
python集成开发环境配置(pycharm)
2020/02/14 Python
PyQt中使用QtSql连接MySql数据库的方法
2020/07/28 Python
python安装cx_Oracle和wxPython的方法
2020/09/14 Python
Python二元算术运算常用方法解析
2020/09/15 Python
Html5 new XMLHttpRequest()监听附件上传进度
2021/01/14 HTML / CSS
JYSK加拿大:购买家具、床垫、家居装饰等
2020/02/14 全球购物
工程预算与管理应届生求职信
2013/10/06 职场文书
建筑设计学生的自我评价
2014/01/16 职场文书
国际商务专业职业生涯规划书范文
2014/01/17 职场文书
贷款承诺书范文
2014/05/19 职场文书
护士找工作求职信
2014/07/02 职场文书
班主任寄语2015
2015/02/26 职场文书
研究生毕业登记表的自我鉴定范文
2019/07/15 职场文书
你会写报告?产品体验报告到底该怎么写?
2019/08/14 职场文书
Spring IOC容器Bean的作用域及生命周期实例
2022/05/30 Java/Android