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教程之PHP中shell脚本的使用方法分享
Feb 23 PHP
phpmyadmin显示utf8_general_ci中文乱码的问题终级篇
Apr 08 PHP
smarty基础之拼接字符串的详解
Jun 18 PHP
php数组转换js数组操作及json_encode的用法详解
Oct 26 PHP
php中session退出登陆问题
Feb 27 PHP
用 Composer构建自己的 PHP 框架之使用 ORM
Oct 30 PHP
php使用GD实现颜色渐变实例
Jun 02 PHP
用PHP代码给图片加水印
Jul 01 PHP
php正则表达式基本知识与应用详解【经典教程】
Apr 17 PHP
Laravel中服务提供者和门面模式的入门介绍
Nov 06 PHP
Laravel Eloquent分表方法并使用模型关联的实现
Nov 25 PHP
laravel框架数据库操作、查询构建器、Eloquent ORM操作实例分析
Dec 20 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
高分R级DC动画剧《哈莉·奎茵》第二季正式预告首发
2020/04/09 欧美动漫
php中用数组的方法设置cookies
2011/04/21 PHP
gd库图片下载类实现下载网页所有图片的php代码
2012/08/20 PHP
限制ckeditor上传图片文件大小的方法
2013/11/15 PHP
PHP环境中Memcache的安装和使用
2015/11/05 PHP
js 数据类型转换总结笔记
2011/01/17 Javascript
JQuery 自定义CircleAnimation,Animate方法学习笔记
2011/07/10 Javascript
jquery获取URL中参数解决中文乱码问题的两种方法
2013/12/18 Javascript
jQuery实现简单隔行变色的方法
2016/02/20 Javascript
js css实现垂直方向自适应的三角提示菜单
2016/06/26 Javascript
Javascript typeof与instanceof的区别
2016/10/18 Javascript
Jquery鼠标放上去显示全名的实现方法
2017/02/06 Javascript
node前端开发模板引擎Jade的入门
2018/05/11 Javascript
使用webpack3.0配置webpack-dev-server教程
2018/05/29 Javascript
Vue头像处理方案小结
2018/07/26 Javascript
swiper在vue项目中loop循环轮播失效的解决方法
2018/09/15 Javascript
vue 使用vue-i18n做全局中英文切换的方法
2018/10/29 Javascript
微信小程序实现菜单左右联动
2020/05/19 Javascript
给你选择Python语言实现机器学习算法的三大理由
2017/11/15 Python
Python语言描述KNN算法与Kd树
2017/12/13 Python
Python Socket使用实例
2017/12/18 Python
对python判断是否回文数的实例详解
2019/02/08 Python
树莓派3 搭建 django 服务器的实例
2019/08/29 Python
使用Python的Turtle绘制哆啦A梦实例
2019/11/21 Python
pytorch中tensor张量数据类型的转化方式
2019/12/31 Python
python手写均值滤波
2020/02/19 Python
html5教程制作简单画板代码分享
2013/12/04 HTML / CSS
俄罗斯旅游网站:Tripadvisor俄罗斯
2017/03/21 全球购物
美国一站式电动和手动工具商店:International Tool
2020/11/26 全球购物
党课学习思想汇报
2014/01/02 职场文书
普通党员对照检查材料
2014/08/28 职场文书
旷课检讨书500字
2014/10/14 职场文书
2014年政风行风工作总结
2014/11/22 职场文书
2015年党员个人工作总结
2015/05/13 职场文书
2016父亲节感恩话语
2015/12/09 职场文书
Python实现查询剪贴板自动匹配信息的思路详解
2021/07/09 Python