一、应用场景
在项目中,大家肯定都见过php导出功能,比如导出成csv格式、excel格式,这些是很常见的,而我前面也有记录过导出成csv的方式,php 生成csv文件, 但是想要下载指定的文件夹呐??
现在想下载这个wx_media目录下的三个目录,怎么处理呐???
二、解决之法
首先想到了快速的方法1:使用laravel扩展;
可是调研发现,先不说能否实现,关键是这个扩展要求laravel版本高于5,pass
为了一劳永逸,我干脆采用PHP的扩展得了,直接使用PHP5.2以来就具有的Ziparchive类。如果使用请确保php.ini开启了ext-zip扩展
三、实现
1.首先,你肯定要开启这个PHP扩展的呀,
2.
public function getZipper()
{
$zip = new \ZipArchive();
// 图片路径
$img_path = public_path('/upload/wx_media/image');
// MP3路径
$mp3_path = public_path('upload/wx_media/mp3');
$img_files = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($img_path));
$mp3_files = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($mp3_path));
$zip_file = $this->zip_file;
$zip->open($zip_file, \ZipArchive::CREATE | \ZipArchive::OVERWRITE);
$this->forZip($zip, $img_files, $img_path, 'image/');
$this->forZip($zip, $mp3_files, $mp3_path, 'mp3/');
$zip->close();
return Redirect::to($zip_file);
}
下面是打包的过程
public function forZip($zip, $files, $file_path, $new_path)
{
foreach ($files as $name => $file) {
// 我们要跳过所有子目录
if ( ! $file->isDir()) {
$filePath = $file->getRealPath();
// 用 substr/strlen 获取文件扩展名
$relativePath = $new_path . substr($filePath, strlen($file_path) + 1);
$zip->addFile($filePath, $relativePath);
}
}
}
这样就会下载一个压缩包,而压缩包的地址则是存放在你指定的$zip_file地址中,其实就是打包了你指定的目录下的目录然后放在了一个定好的zip文件里面,最后在访问下载这个zip文件路径就下载了