最近接到一個需求,就是選擇多個文件下載時,不要一個一個下載,直接把多個文件打包成一個文件進行下載。我們項目是前后端分離,所以我寫了個接口,讓前端傳參數,后台下載。
廢話不多說,直接上代碼:
先是壓縮單個文件的:
$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');
前端傳的參數是以逗號分隔傳給我的路勁。
