本文实例讲述了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 html' target='_blank'>class , uses zLibclass 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格式并下载到本地的方法的详细内容,PHP教程
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。
新闻热点
疑难解答