PHP实现zip压缩打包下载
先来看PHP实现文件及文件夹的zip压缩
这里使用PHP扩展的ZipArchive类,在使用之前要将php.ini文件中的zlib.output_compression设置为On
代码如下:
public function addFileToZip($path, $current, $zip) { // 打开文件夹资源 $handler = opendir($path); // 循环读取文件夹内容 while(($filename = readdir($handler)) !== false) { // 过滤掉Linux系统下的.和..文件夹 if ($filename != '.' && $filename != '..') { // 文件指针当前位置指向的如果是文件夹,就递归压缩 if (is_dir($path.'/'.$filename)) { $this->addFileToZip($path.'/'.$filename, $filename, $zip); }else { // 为了在压缩文件的同时也将文件夹压缩,可以设置第二个参数为文件夹/文件的形式,文件夹不存在自动创建压缩文件夹 $zip->addFile($path.'/'.$filename, $current.'/'.$filename); } } } @closedir($handler); } $zipName = 'your zip file path'; // 如果压缩文件不存在,就创建压缩文件 if (! is_file($zipName)) { $fp = fopen($zipName, 'w'); fclose($fp); } $zip = new \ZipArchive(); // OVERWRITE选项表示每次压缩时都覆盖原有内容,但是如果没有那个压缩文件的话就会报错,所以事先要创建好压缩文件 // 也可以使用CREATE选项,此选项表示每次压缩时都是追加,不是覆盖,如果事先压缩文件不存在会自动创建 if ($zip->open($zipName, \ZipArchive::OVERWRITE) === true) {
$current = 'uplaods/'; // 你要压缩的文件的主目录 $compress->addFileToZip($path, $current, $zip); $zip->close(); }else { exit('下载失败!'); }
在压缩完之后我们可能还需要下载,而且下载完之后还可以删除压缩文件。
代码如下:
class Download { public static function downloadFile($filePath,$showName) { if (is_file($filePath)) { //打开文件 $file = fopen($filePath,"r"); //返回的文件类型 Header("Content-type: application/octet-stream"); //按照字节大小返回 Header("Accept-Ranges: bytes"); //返回文件的大小 Header("Accept-Length: ".filesize($filePath)); //这里设置客户端的弹出对话框显示的文件名 Header("Content-Disposition: attachment; filename=".$showName); //一次性将数据传输给客户端 //echo fread($file, filesize($filePath)); //一次只传输1024个字节的数据给客户端 //向客户端回送数据 $buffer=1024;// //判断文件是否读完 while (!feof($file)) { //将文件读入内存 $file_data = fread($file, $buffer); //每次向客户端回送1024个字节的数据 echo $file_data; } return true; }else { return false; } } } // 调用这个方法的部分 // 下载压缩后的文件 if (! Download::downloadFile($zipName, $showName)) { return "<script>alert('下载失败!')</script>"; }else { @unlink($zipName); }
以上的代码基本可以实现简单的打包下载功能。