Laravel 8 从Storage/app/public下载文件无报错却失效如何解决
Laravel 8 Storage/app/public 目录文件下载功能修复方案
现有代码问题梳理
- 路由请求类型不匹配:路由定义的是
POST类型的下载接口,但前端用<a>标签发起的是GET请求,请求无法匹配路由 - 路由参数和控制器参数不对应:路由定义的参数是
{id},但控制器方法接收的参数是$file_name,取值逻辑错位 - 控制器存在未定义变量:代码中使用了未声明的
$data变量,导致路径拼接失败 - 文件路径拼接错误:
storage/app/public目录的路径拼接逻辑不对,没有正确指向public磁盘对应的物理路径 - HTML规范问题:
<a>标签嵌套<button>不符合HTML语法规范,可能导致部分浏览器交互异常
修复后代码
1. web.php
Route::get('/viewAllFile',[DownloadController::class, 'downfunc']); // 改为GET请求,参数和控制器接收参数对齐 Route::get('download/{file_name}',[DownloadController::class, 'download']);
2. DownloadController.php
class DownloadController extends Controller { public function downfunc() { $downloads = DB::table('files')->get(); return view('download.viewfile', compact('downloads')); } public function download($file_name) { // 前置判断文件是否存在,避免无效请求报错 if (!Storage::disk('public')->exists($file_name)) { abort(404, '请求的文件不存在'); } // 拼接public磁盘对应的物理路径:storage/app/public/文件名 $filepath = storage_path("app/public/{$file_name}"); // 第二个参数可自定义下载后展示的文件名 return \Response::download($filepath, $file_name); } }
3. viewfile.blade.php
@foreach($downloads as $down) <tr> <td>{{$down->name}}</td> <td>{{$down->directory}}</td> <td>{{$down->updated_at}}</td> <td> <!-- 移除嵌套的button,直接给a标签加样式类即可 --> <a href="{{url('/download/'.$down->name)}}" class="btn btn-primary"> Download </a> </td> </tr> @endforeach
内容的提问来源于stack exchange,提问作者tonini
相关产品推荐
相关产品推荐

