PHP实现将多个文件压缩成zip格式并下载到本地
PHP实现将多个文件压缩成zip格式并下载到本地
这篇文章主要介绍了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压缩类:
#
# 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 ifreturn (($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 overallpack('V', strlen($ctrldir)) . // size of central dirpack('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操作zip文件及压缩技巧总结》、《php文件操作总结》、《PHP基本语法入门教程》、《php面向对象程序设计入门教程》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》
希望本文所述对大家PHP程序设计有所帮助。
您可能感兴趣的文章:
PHP 实现文件压缩解压操作的方法
php使用pclzip类实现文件压缩的方法(附pclzip类下载地址)
php文件压缩之PHPZip类用法实例
PHP调用Linux的命令行执行文件压缩命令
php实现对文件压缩简单的方法
原文链接:https://www.jb51.net/article/140633.htm
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
