ThinkPHP动态生成zip压缩包文件并下载的解决方案
发表于:2023-08-08 18:17:05浏览:830次
PHP ZipArchive是PHP自带的扩展类,可以轻松实现ZIP文件的压缩和解压,使用前首先要确保PHP的ZIP扩展已经开启,这里整理个很普通的动态生成zip压缩包文件并下载的示例供参考。
需求:
提供N个文件的路径,文件再打包前需要重新命名,将文件打包压缩成zip文件,并下载。
解决:
无需要下载任何插件,测试环境本地Ngnix和云主机均可。
代码:
访问zip_down方法,需要注意需要打包的文件,也就是$fileArray数组中的路径需要真实的物理路径,比如:
D:\wwwroot\gouguoa\public\public\storage\202308\aaaaa.jpg
具体代码如下:
//打包文件
public function create_zip($pathArr,$zipName){
$zip = new \ZipArchive();
if($zip->open($zipName,\ZipArchive::CREATE|\ZipArchive::OVERWRITE)){
foreach($pathArr as $file){
$path = CMS_ROOT."public".$file['filepath'];
if(!file_exists($path)){
continue;
}
$zip->addFile($path,$file['name']); //向压缩包中添加文件
}
$zip->close();
return ['code'=>0,'info'=>"创建成功",'path'=>$zipName];
}else{
return ['code'=>1,'info'=>'创建失败'];
}
}
//下载文件
public function zip_down()
{
$fileArray = [
["name" => "11.png","filepath" => "/storage/202308/0b62e66de379ef4014532b3c7bcbfc38.png"],
["name" => "001需求.doc","filepath" => "/storage/202308/34ee09861db8208387812d5.doc" ],
["name" => "2903453064-副本.mp4","filepath" =>"/storage/202308/bd4b515310447cdb7029f64f.mp4"]
];
//生成压缩文件名
$fileName = '我是新的压缩包.zip';
//前面的读取真实的物理路径
$zipName = CMS_ROOT."public".'/storage/zip/'.$fileName;
$res = $this->create_zip($fileArray,$zipName);
//halt($res);
if($res['code']==0){
$fileUrl = $res['path'];
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . $fileName . '"');
readfile($fileUrl);
//下载完成后删除文件
@unlink($fileUrl);
exit;
}
else{
return to_assign(1, "操作失败");
}
}
else{
return to_assign(1, "找不到相关附件");
}
}
实际效果: