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新手上路(十一)
Oct 09 PHP
PHP静态类
Nov 25 PHP
一个很不错的PHP翻页类
Jun 01 PHP
php面向对象全攻略 (六)__set() __get() __isset() __unset()的用法
Sep 30 PHP
jQuery 源码分析笔记
May 25 PHP
浅析虚拟主机服务器php fsockopen函数被禁用的解决办法
Aug 07 PHP
php中JSON的使用方法
Apr 30 PHP
php简单实现批量上传图片的方法
May 09 PHP
Linux下快速搭建php开发环境
Mar 13 PHP
Laravel5.* 打印出执行的sql语句的方法
Jul 24 PHP
Ecshop 后台添加新功能栏目及管理权限设置教程
Nov 21 PHP
yii框架结合charjs统计上一年与当前年数据的方法示例
Apr 04 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
DC四月将推出百页特刊漫画 纪念小丑诞生80周年
2020/04/09 欧美动漫
PHP通用检测函数集合
2006/11/25 PHP
php导出word文档与excel电子表格的简单示例代码
2014/03/08 PHP
PHPExcel中文帮助手册|PHPExcel使用方法(分享)
2017/06/09 PHP
thinkphp5.0整合phpsocketio完整攻略(绕坑)
2018/10/12 PHP
实例分析10个PHP常见安全问题
2019/07/09 PHP
PHP抽象类和接口用法实例详解
2019/07/20 PHP
jquery中防刷IP流量软件影响统计的一点对策
2011/07/10 Javascript
拉动滚动条加载数据的jquery代码
2012/05/03 Javascript
浅析JQuery中的html(),text(),val()区别
2014/09/01 Javascript
jquery队列函数用法实例
2014/12/16 Javascript
JavaScript中的方法调用详细介绍
2014/12/30 Javascript
JavaScript知识点总结(十一)之js中的Object类详解
2016/05/31 Javascript
JS+html5 canvas实现的简单绘制折线图效果示例
2017/03/13 Javascript
es6系列教程_ Map详解以及常用api介绍
2017/09/25 Javascript
面包屑导航详解
2017/12/07 Javascript
npm全局模块卸载及默认安装目录修改方法
2018/05/15 Javascript
ng-alain表单使用方式详解
2018/07/10 Javascript
解决angular2 获取到的数据无法实时更新的问题
2018/08/31 Javascript
vxe-table vue table 表格组件功能
2019/05/26 Javascript
Vue 实现分页与输入框关键字筛选功能
2020/01/02 Javascript
es6函数name属性功能与用法实例分析
2020/04/18 Javascript
SpringBoot+Vue 前后端合并部署的配置方法
2020/12/30 Vue.js
[02:04]2020年夜魇暗潮预告片
2020/10/30 DOTA
Python列表list操作符实例分析【标准类型操作符、切片、连接字符、列表解析、重复操作等】
2017/07/24 Python
Python+matplotlib实现计算两个信号的交叉谱密度实例
2018/01/08 Python
用uWSGI和Nginx部署Flask项目的方法示例
2019/05/05 Python
Tensorflow实现神经网络拟合线性回归
2019/07/19 Python
python使用原始套接字发送二层包(链路层帧)的方法
2019/07/22 Python
使用Python的turtle模块画国旗
2019/09/24 Python
html5配合css3实现带提示文字的输入框(摆脱js)
2013/03/08 HTML / CSS
品质管理部岗位职责范文
2014/03/01 职场文书
元旦活动感言
2014/03/08 职场文书
马丁路德金演讲稿
2014/05/19 职场文书
个人工作保证书
2015/02/28 职场文书
建党伟业电影观后感
2015/06/01 职场文书