public function downloadFile()
{
$params = $this->request->param();
$zip = new \ZipArchive();
//如果请求体没有files或者为空则返回错误
if (!isset($params["files"]) || $params["files"] == null) {
return json([
"code" => 0,
"msg" => "error",
"data" => "files不能为空"
]);
}
try {
//创建一个压缩文件,以当前毫秒数为名称,注意释放这个zip流
$time = time() . ".zip";
$res = $zip->open($time, \ZipArchive::CREATE);
if ($res === false) {
return json([
"code" => 0,
"msg" => "error",
"data" => "创建压缩包失败"
]);
}
//循环添加文件
foreach ($params["files"] as $file) {
$urlArr = explode("/", $file["file_url"]);
$sliceUrl = array_slice($urlArr, -2); //获取数组最后两个值
$url = implode("/", $sliceUrl); //在将数组最后的两个值变成一个字符串
$file["file_url"] = "../public/upload/default/" . $url;
if (!file_exists($file["file_url"])) {
return json([
"code" => 0,
"msg" => "error",
"data" => "下载失败,原因:" . $file["file_name"] . "文件不存在"
]);
}
$zip->addFile($file["file_url"], $file["file_name"]);
}
$zip->close();
ob_clean();
// 设置响应头,告诉浏览器返回的是一个流
header('Access-Control-Allow-Origin:*');
header('Content-Length: ' . filesize($time));
header("Cache-Control: public");
header("Content-Description: File Transfer");
header("Content-Type: application/zip");
header("Content-Transfer-Encoding: binary");
header("Content-Disposition: attachment; filename=\"" . basename($time) . "\"");
readfile($time);
//删除服务端生成的zip文件
ignore_user_abort(true);
unlink($time);
exit;
} catch (Exception $exception) {
$zip->close();
Log::record($exception->getLine(), "----------line------------");
Log::record($exception->getMessage(), "----------error------------");
return json([
"code" => 0,
"msg" => "error",
"data" => "服务器异常,请稍后再试!!!"
]);
}
}
php实现多文件压缩,并返回给浏览器下载
于 2023-08-26 20:18:02 首次发布