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);
    }
}

视图部分就不展示了,代码写的寒碜,请大家不要笑话,下载整个目录已经完成,谢谢大家!我目录如果想实现分页,又该如何处理呢?

TigerLin
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 2

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!