动作文件
<?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();
});
}