最近接到一个需求,就是选择多个文件下载时,不要一个一个下载,直接把多个文件打包成一个文件进行下载。我们项目是前后端分离,所以我写了个接口,让前端传参数,后台下载。
废话不多说,直接上代码:
先是压缩单个文件的:
$zip = new ZipArchive; $zip_time = time().".zip"; // 压缩的目录名 $zip_filename = $zip_time; // 指定一个压缩包地址 $zip->open($zip_filename, ZIPARCHIVE::CREATE); // 打开压缩包,没有则创建 // 参数1是要压缩的文件,参数2为压缩后,在压缩包中的文件名 //如果需要的压缩后的文件跟原文件名一样 addFile() 的第二个参数可以改为 basename("../alg/demo1.php"),也就是原文件所在的路径 $zip->addFile("log.txt",basename("log.txt")); $rs = $zip->close(); var_dump($rs);
多个文件下载打包成一个文件的:
<?php function zipfile($file_path) { // 压缩多个文件 $fileList = explode(\',\', $file_path); $filename = time() . ".zip"; // 压缩包所在的位置路径 $zip = new ZipArchive(); $zip->open($filename, ZipArchive::CREATE); //打开压缩包 foreach ($fileList as $file) { $zip->addFile($file, basename($file)); //向压缩包中添加文件 } $rs = $zip->close(); //关闭压缩包 //下载文件 $file = fopen($filename, "r"); //返回的文件类型 Header("Content-type: application/octet-stream"); //按照字节大小返回 Header("Accept-Ranges: bytes"); //返回文件的大小 Header("Accept-Length: " . filesize($filename)); //这里设置客户端的弹出对话框显示的文件名 Header("Content-Disposition: attachment; filename=" . $filename); //一次性将数据传输给客户端 //echo fread($file, filesize($filePath)); //一次只传输1024个字节的数据给客户端 //向客户端回送数据 $buffer = 1024;// //判断文件是否读完 while (!feof($file)) { //将文件读入内存 $file_data = fread($file, $buffer); //每次向客户端回送1024个字节的数据 echo $file_data; } //将生成的zip文件在服务器端删除,只需要客户端下载就行了 @unlink($filename); } zipfile(\'D:\phpstudy_pro\WWW\log.txt,D:\phpstudy_pro\WWW\index.html\');
前端传的参数是以逗号分隔传给我的路劲。