PHP实现将多个文件压缩成zip格式并下载到本地的方法

PHP实现将多个文件压缩成zip格式并下载到本地的方法

内容导读

收集整理的这篇技术教程文章主要介绍了PHP实现将多个文件压缩成zip格式并下载到本地的方法,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含6791字,纯文字阅读大概需要10分钟

内容图文

这篇文章主要介绍了PHP实现将多个文件压缩成zip格式并下载到本地的方法,涉及php针对文件与目录的读写、判断与zip压缩相关操作技巧,需要的朋友可以参考下

本文实例讲述了PHP实现将多个文件压缩成zip格式并下载到本地的方法。分享给大家供大家参考,具体如下:

废话不多说,直接上代码

//这里需要注意该目录是否存在,并且有创建的权限$zipname = 'path/test.zip'//这是要打包的文件地址数组$files = array("mypath/test1.txt","mypath/test2.pdf");$zip = new ZipArchive();$res = $zip->open($zipname, ZipArchive::CREATE);if ($res === TRUE) { foreach ($files as $file) { //这里直接用原文件的名字进行打包,也可以直接命名,需要注意如果文件名字一样会导致后面文件覆盖前面的文件,所以建议重新命名
$new_filename = substr($file, strrpos($file, '/') + 1);
$zip->addFile($file, $new_filename); }}//关闭文件$zip->close();

//这里是下载zip文件header("Content-Type: application/zip");header("Content-Transfer-Encoding: Binary");header("Content-Length: " . filesize($zipname));header("Content-Disposition: attachment; filename="" . basename($zipname) . """);readfile($zipname);exit;

附:这里再为大家提供一个zip压缩类:

<?php# # PHPZip v1.2 by Sext (sext@neud.net) 2002-11-18#
 (Changed: 2003-03-01)# # Makes zip archive## Based on "Zip file creation class", uses zLib##class PHPZip{
function Zip($dir, $zipfilename)
{

if (@function_exists('gzcompress'))

{



$curdir = getcwd();


if (is_array($dir))


 {




$filelist = $dir;


}


else


 {



$filelist = $this -> GetFileList($dir);


}


if ((!empty($dir))&&(!is_array($dir))&&(file_exists($dir))) chdir($dir);


else chdir($curdir);


if (count($filelist)>0)


{



foreach($filelist as $filename)



{




if (is_file($filename))




{





$fd = fopen ($filename, "r");





$content = fread ($fd, filesize ($filename));





fclose ($fd);





if (is_array($dir)) $filename = basename($filename);





$this -> addFile($content, $filename);




}



}



$out = $this -> file();



chdir($curdir);



$fp = fopen($zipfilename, "w");



fwrite($fp, $out, strlen($out));



fclose($fp);


}


return 1;

}

 else return 0;
}
function GetFileList($dir)
{

if (file_exists($dir))

{


$args = func_get_args();


$pref = $args[1];


$dh = opendir($dir);


while($files = readdir($dh))


{



if (($files!=".")&&($files!=".."))



 {




if (is_dir($dir.$files))




 {





$curdir = getcwd();





chdir($dir.$files);





$file = array_merge($file, $this -> GetFileList("", "$pref$files/"));





chdir($curdir);




}




else $file[]=$pref.$files;



}


}


closedir($dh);

}

return $file;
}
var $datasec
 = array();
var $ctrl_dir
 = array();
var $eof_ctrl_dir = "x50x4bx05x06x00x00x00x00";
var $old_offset
= 0;
/**
 * Converts an Unix timestamp to a four byte DOS date and time format (date
 * in high two bytes, time in low two bytes allowing magnitude comparison).
 *
 * @param integer the current Unix timestamp
 *
 * @return integer the current date in a four byte DOS format
 *
 * @access private
 */
function unix2DosTime($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;

} // end if

return (($timearray['year'] - 1980) << 25) | ($timearray['mon'] << 21) | ($timearray['mday'] << 16) |



($timearray['hours'] << 11) | ($timearray['minutes'] << 5) | ($timearray['seconds'] >> 1);
} // end of the 'unix2DosTime()' method
/**
 * Adds "file" to archive
 *
 * @param string
file contents
 * @param string
name of the file in the archive (may contains the path)
 * @param integer the current timestamp
 *
 * @access public
 */
function addFile($data, $name, $time = 0)
{

$name
 = str_replace('', '/', $name);

$dtime
= dechex($this->unix2DosTime($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
= "x50x4bx03x04";

$fr
.= "x14x00";


// ver needed to extract

$fr
.= "x00x00";


// gen purpose bit flag

$fr
.= "x08x00";


// compression method

$fr
.= $hexdtime;


 // last mod time and date

// "local file header" segment

$unc_len = strlen($data);

$crc
 = crc32($data);

$zdata
= gzcompress($data);

$c_len
= strlen($zdata);

$zdata
= substr(substr($zdata, 0, strlen($zdata) - 4), 2); // fix crc bug

$fr
 .= pack('V', $crc);


 // crc32

$fr
 .= pack('V', $c_len);


// compressed filesize

$fr
 .= pack('V', $unc_len);

 // uncompressed filesize

$fr
 .= pack('v', strlen($name));
// length of filename

$fr
 .= pack('v', 0);



// extra field length

$fr
 .= $name;

// "file data" segment

$fr .= $zdata;

// "data descriptor" segment (optional but necessary if archive is not

// served as file)

$fr .= pack('V', $crc);



 // crc32

$fr .= pack('V', $c_len);



// compressed filesize

$fr .= pack('V', $unc_len);


 // uncompressed filesize

// add this entry to array

$this -> datasec[] = $fr;

$new_offset

= strlen(implode('', $this->datasec));

// now add to central directory record

$cdrec = "x50x4bx01x02";

$cdrec .= "x00x00";



// version made by

$cdrec .= "x14x00";



// version needed to extract

$cdrec .= "x00x00";



// gen purpose bit flag

$cdrec .= "x08x00";



// compression method

$cdrec .= $hexdtime;



 // last mod time & date

$cdrec .= pack('V', $crc);


// crc32

$cdrec .= pack('V', $c_len);

 // compressed filesize

$cdrec .= pack('V', $unc_len);

// uncompressed filesize

$cdrec .= pack('v', strlen($name) ); // length of filename

$cdrec .= pack('v', 0 );


 // extra field length

$cdrec .= pack('v', 0 );


 // file comment length

$cdrec .= pack('v', 0 );


 // disk number start

$cdrec .= pack('v', 0 );


 // internal file attributes

$cdrec .= pack('V', 32 );


// external file attributes - 'archive' bit set

$cdrec .= pack('V', $this -> old_offset ); // relative offset of local header

$this -> old_offset = $new_offset;

$cdrec .= $name;

// optional extra field, file comment goes here

// save to central directory

$this -> ctrl_dir[] = $cdrec;
} // end of the 'addFile()' method
/**
 * Dumps out file
 *
 * @return string the zipped file
 *
 * @access public
 */
function file()
{

$data
= implode('', $this -> datasec);

$ctrldir = implode('', $this -> ctrl_dir);

return


$data .


$ctrldir .


$this -> eof_ctrl_dir .


pack('v', sizeof($this -> ctrl_dir)) . // total # of entries "on this disk"


pack('v', sizeof($this -> ctrl_dir)) . // total # of entries overall


pack('V', strlen($ctrldir)) .


// size of central dir


pack('V', strlen($data)) .


 // offset to start of central dir


"x00x00";






 // .zip file comment length
} // end of the 'file()' method} // end of the 'PHPZip' class?>

用法:

$zipfiles =array("/root/pooy/test1.txt","/root/pooy/test2.txt");$z = new PHPZip();//$randomstr = random(8);$zipfile = TEMP."/photocome_".$groupid.".zip";$z->Zip($zipfiles, $zipfile);

您可能感兴趣的文章:

PHP递归遍历文件夹去除注释并压缩php源代码的方法

PHP工厂模式简单实现方法示例

PHP自定义函数实现assign()数组分配到模板及extract()变量分配到模板功能示例

以上就是PHP实现将多个文件压缩成zip格式并下载到本地的方法的详细内容,更多请关注Gxl网其它相关文章!

内容总结

以上是为您收集整理的PHP实现将多个文件压缩成zip格式并下载到本地的方法全部内容,希望文章能够帮你解决PHP实现将多个文件压缩成zip格式并下载到本地的方法所遇到的程序开发问题。 如果觉得技术教程内容还不错,欢迎将网站推荐给程序员好友。

内容备注

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。


本文关键词:

联系我们

在线咨询:点击这里给我发消息

邮件:w420220301@qq.com