Laravel 文件目录下载处理,求教
由于水平有限,这两天捣鼓个东西很是吃力,需求是把上传的图片合成处理后,再形成目录下载下来,图片合成采用的Intervention/image的扩展,实现代码。图片合成后,就需要展示浏览,laravel 有自己的文件管理功能,具体操作如下
1.创建软连接,public/storage 对象到storage/app/public的目录,这个配置是在config/filesystems.php里有配置的
php artisan storage:link
2.创建控制器,思想如下:我的目录是两层,需要两个视图,一个是目录列表,一个是图片列表,目录列表展示所有目录,可以整个目录进行下载,图片列表图片展示。
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
class HomesController extends Controller
{
//
protected $folders = [];
protected $files = [];
// 文件夹列表控制器
public function test()
{
// 获取路径下所有文件,例如 // 0 => "public/admin_20190714"
$files = Storage::allDirectories('public');
// 遍历拆解数组,获取我所需要的文件夹名,拼成新的数组
foreach ( $files as $file ) {
$this->folders[] = explode('/', $file)[1];
}
return view('test', ['folders' => $this->folders]);
}
// 图片列表控制器
public function file()
{
// 路由把文件夹参数带入
$file_name = $_GET['name'];
// laravel 的文件管理方法,获取文件名的完整文件 例如 0 => "public/admin_20190714/11111.jpg"
$data = Storage::Files('public/'.$file_name);
// $files = Storage::allFiles('public');
// 遍历拆解数组 ,将文件名称 和文件的 url 地址添加到新数组中
foreach ($data as $k=>$v) {
$file = explode('/', $v)[2];
$url = Storage::url($file_name.'/'.$file); // http://lesson.test/storage/admin_20190714/11111.jpg
$this->files[$k]['file'] = $file;
$this->files[$k]['url'] = $url;
}
return view('file', [ 'files' => $this->files]);
}
// laravel 的文件下载
public function zip()
{
$folder = $_GET['folder'];
$zip_file = $folder.'.zip'; //下载的zip的文件名
$zip = new \ZipArchive();
$zip->open($zip_file, \ZipArchive::CREATE | \ZipArchive::OVERWRITE);
// 这里是要下载的文件路径 我的路径是storage/app/public下的目录
$path = storage_path('app/public/'.$folder);
// dd($path);
$files = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($path));
foreach ($files as $name => $file)
{
// 我们要跳过所有子目录
if (!$file->isDir()) {
$filePath = $file->getRealPath();
// 用 substr/strlen 获取文件扩展名
$relativePath = $folder. substr($filePath, strlen($path) + 1);
$zip->addFile($filePath, $relativePath);
}
}
$zip->close();
return response()->download($zip_file);
}
}
视图部分就不展示了,代码写的寒碜,请大家不要笑话,下载整个目录已经完成,谢谢大家!我目录如果想实现分页,又该如何处理呢?
翻译:Laravel 中创建 Zip 压缩文件并提供下载