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语法(2)
Oct 09 PHP
从Web查询数据库之PHP与MySQL篇
Sep 25 PHP
str_replace只替换一次字符串的方法
Apr 09 PHP
PHP中的output_buffering详细介绍
Sep 27 PHP
php 使用curl模拟登录人人(校内)网的简单实例
Jun 06 PHP
php实现批量修改文件名称的方法
Jul 23 PHP
php断点续传之文件分割合并详解
Dec 13 PHP
swoole和websocket简单聊天室开发
Nov 18 PHP
PHP的介绍以及优势详细分析
Sep 05 PHP
PHP MVC框架中类的自动加载机制实例分析
Sep 18 PHP
php实现推荐功能的简单实例
Sep 29 PHP
使用laravel的Eloquent模型如何获取数据库的指定列
Oct 17 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 模拟POST|GET操作实现代码
2010/07/20 PHP
codeigniter自带数据库类使用方法说明
2014/03/25 PHP
PHP实现的方程求解示例分析
2016/11/11 PHP
PHP正则删除HTML代码中宽高样式的方法
2017/06/12 PHP
Laravel框架路由和控制器的绑定操作方法
2018/06/12 PHP
PHP实现创建一个RPC服务操作示例
2020/02/23 PHP
jQuery 如何给Carousel插件添加新的功能
2016/04/18 Javascript
微信小程序 删除项目工程实现步骤
2016/11/10 Javascript
Html中 IFrame的用法及注意点
2016/12/22 Javascript
Ajax跨域实现代码(后台jsp)
2017/01/21 Javascript
JavaScript中常见的八个陷阱总结
2017/06/28 Javascript
ES6 javascript的异步操作实例详解
2017/10/30 Javascript
微信小程序城市选择及搜索功能的方法
2019/03/22 Javascript
layui写后台表格思路和赋值用法详解
2019/11/14 Javascript
vue-cli设置publicPath小记
2020/04/14 Javascript
Layer UI表格列日期格式化及取消自动填充日期的实现方法
2020/05/10 Javascript
Vue3 响应式侦听与计算的实现
2020/11/11 Javascript
JavaScript实现H5接金币功能(实例代码)
2021/02/22 Javascript
[01:30:55]VG vs Mineski Supermajor 败者组 BO3 第三场 6.6
2018/06/07 DOTA
[00:59]PWL开团时刻DAY7——我在赶
2020/11/06 DOTA
python zip文件 压缩
2008/12/24 Python
python通过apply使用元祖和列表调用函数实例
2015/05/26 Python
Python中的函数作用域
2018/05/07 Python
pandas数据清洗,排序,索引设置,数据选取方法
2018/05/18 Python
浅谈Python里面小数点精度的控制
2018/07/16 Python
搭建python django虚拟环境完整步骤详解
2019/07/08 Python
pycharm新建Vue项目的方法步骤(图文)
2020/03/04 Python
Python实现删除某列中含有空值的行的示例代码
2020/07/20 Python
解析HTML5的存储功能和web SQL的相关操作方法
2016/02/19 HTML / CSS
英国领先的办公用品供应商:Viking
2016/08/01 全球购物
MVMT手表官方网站:时尚又实惠的高品质手表
2016/12/04 全球购物
如何整合JQuery和Prototype
2014/01/31 面试题
社区网格化管理实施方案
2014/03/21 职场文书
鉴定评语大全
2014/05/05 职场文书
学校教代会开幕词
2016/03/04 职场文书
Python实现简繁体转换
2021/06/07 Python