动作文件

<?php

namespace App\Admin\Actions\Grid;

use Dcat\Admin\Actions\Response;
use Dcat\Admin\Grid\BatchAction;
use Dcat\Admin\Traits\HasPermissions;
use GuzzleHttp\Client;
use Illuminate\Contracts\Auth\Authenticatable;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Http\Request;
use Dcat\Admin\Widgets\Modal;
use Illuminate\Support\Facades\Storage;

class Download extends BatchAction
{
    /**
     * @return string
     */
    protected $title = '批量下载';

    /**
     * Handle the action request.
     *
     * @param Request $request
     *
     * @return Response
     */
    public function handle(Request $request)
    {

        $ids=$request->_key;
        $fileData = \App\Models\Item::whereIn("id", $ids)->get(['material','name','flag']);
        if (!$fileData||!$ids){
            return $this->response()->error('数据异常!');
        }
        $client = new Client(['verify' => false]); //忽略SSL错误
        $judge = false; //判断是否保存完毕
        $base_name = rand(0,100).time();
        $base_path = 'document/'.$base_name.'remoteFiles/';
        foreach ($fileData as $val) {
            $file_temp_path = $base_path . '['.$val['name'].']'.pathinfo($val['material'])['basename']; //保存文件地址+原始文件名
            $tempData = $client->request('get', $val['material'])->getBody()->getContents();
            $judge = Storage::disk('public')->put($file_temp_path, $tempData); //storage/app/public/document/remoteFiles文件保存地址
        }
        if ($judge) {
            //2.打包下载本地文件夹
            //初始化zip 名字
            $zipName = $base_name.'.file.zip';
            $zip_file = str_replace("\\", '/', storage_path('app/public/document/')) . $zipName; //storage/app/public/document/file.zip
            $zip = new \ZipArchive();
            $zip->open($zip_file, \ZipArchive::CREATE | \ZipArchive::OVERWRITE);
            //将被压缩文件夹
            $path = str_replace("\\", '/', storage_path('app/public/'.$base_path)); //storage/app/public/document/remoteFiles
            //迭代器
            $files = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($path));
            foreach ($files as $file) {
                //跳过所有子目录
                if (!$file->isDir()) {
                    //获取文件路径
                    $filePath = $file->getRealPath();
                    //获取文件名
                    $fileName = $file->getFilename();
                    $zip->addFile($filePath, $fileName);
                }
            }
            $zip->close();
            //解压后删除打包文件夹
             Storage::disk('public')->deleteDirectory($base_path);
            //对storage做了软连接  php artisan storage:link
            $download_path = $request->instance()->root().'/storage/document/' . $zipName; 链接下载地址
                        //Dcat动作中的下载
            return $this->response()->Download($download_path);
        }
        return $this->response()->error('数据异常!');

    }

}

对应控制器表格

 protected function grid()
    {
        return Grid::make(new Item(), function (Grid $grid) {
            $grid->column('id')->sortable();
            $grid->column('name');
            $grid->column('group');
            $grid->column('price');
            $grid->column('people_num');
            $grid->column('financing_price');
            $grid->column('linkman');
            $grid->column('contact');
            $grid->column('company');
            $grid->column('desc');
            $grid->column('certificate')->image();
            $grid->column('material')->link();
            $grid->column('flag_text','审批意见');
            $grid->column('created_at');
            $grid->column('updated_at')->sortable();
            $grid->showActions();
            $grid->filter(function (Grid\Filter $filter) {
                $filter->equal('id');

            });
            $grid->disableFilterButton();
            $grid->disableRefreshButton();
            $grid->showBatchActions();
            $grid->batchActions([new ItemAction(),new DownloadAction()]);
            $grid->showRowSelector();
//            $grid->disableBatchDelete();
            $grid->disableCreateButton();
            $grid->disableEditButton();
//            $grid->disableToolbar();
        });
    }