PHP多個(gè)圖片壓縮成ZIP的方法
更新時(shí)間:2020年08月18日 14:39:30 投稿:lijiao
這篇文章主要為大家詳細(xì)介紹了PHP多個(gè)圖片壓縮成ZIP的方法,可將多個(gè)文件壓縮成一個(gè)zip壓縮包,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
本文實(shí)例為大家分享了PHP多個(gè)圖片壓縮成ZIP的具體代碼,供大家參考,具體內(nèi)容如下
可將多個(gè)文件壓縮成一個(gè)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);
}
/**
* 轉(zhuǎn)碼為UTF-8
* @param $keyword 要轉(zhuǎn)碼的字符串
*/
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');//產(chǎn)生一個(gè)臨時(shí)文件,用于緩存下載文件
$zip = new zipfile();
//----------------------
$filename = 'image.zip'; //下載的默認(rèn)文件名
$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']);
// 添加打包的圖片,第一個(gè)參數(shù)是圖片內(nèi)容,第二個(gè)參數(shù)是壓縮包里面的顯示的名稱, 可包含路徑
// 或是想打包整個(gè)目錄 用 $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.'"'); //設(shè)置下載的默認(rèn)文件名
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();
?>
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
php設(shè)計(jì)模式 FlyWeight (享元模式)
運(yùn)用享元技術(shù)有效的支持大量細(xì)粒度的對(duì)象,需要的朋友可以參考下。2011-06-06
學(xué)習(xí)php設(shè)計(jì)模式 php實(shí)現(xiàn)原型模式(prototype)
這篇文章主要介紹了php設(shè)計(jì)模式中的原型模式,使用php實(shí)現(xiàn)原型模式,感興趣的小伙伴們可以參考一下2015-12-12
深入file_get_contents與curl函數(shù)的詳解
本篇文章是對(duì)file_get_contents與curl函數(shù)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06
使用PHP提取視頻網(wǎng)站頁(yè)面中的FLASH地址的代碼
這幾天工作中需要寫(xiě)個(gè)程序?qū)τ谝粋€(gè)視頻網(wǎng)站地址,如優(yōu)酷的某個(gè)地址,提取出其中的FLASH地址來(lái)。2010-04-04

