Laravel7下载已上传文件时出现404页面不存在错误是什么原因?
报错原因
- 路由路径与前端跳转路径不匹配。web.php中定义的下载路由是
/download/{file},但前端a标签的href写为/detalles-tickets/download/{{ $detalleTicket->file }},路径前缀多了detalles-tickets段,访问地址和注册的路由无法匹配,直接触发404。 - 文件读写逻辑存在隐患。你直接使用相对路径
storage/读写文件,Laravel运行时会基于入口文件public/index.php的位置解析路径,如果没有正确创建存储软链接、或者public/storage目录权限不足,也会在下载阶段找不到文件返回404。
解决方案
- 修正路由与前端路径的匹配问题,二选一即可:
- 方案一:修改web.php的路由定义,补充对应的路径前缀:
Route::get('/detalles-tickets/download/{file}', 'Backend\DetalleTicketController@download')->name('detalles-tickets.download');- 方案二:前端直接用路由名称生成访问地址,避免手动写路径出错:
<a title="Download" id="download" class="btn btn-sm btn-success" href="{{ route('detalles-tickets.download', $detalleTicket->file) }}"> <i class="fa fa-download"></i> </a> - 优化文件读写逻辑,避免相对路径解析问题:
- 先执行Laravel默认的存储软链接创建命令:
php artisan storage:link - 调整store方法的存储逻辑,使用Laravel自带的存储门面操作:
public function store(Request $request){ $detalleTicket = new DetalleTicket(); if($request->file('file')){ $file = $request->file('file'); $filename = time().'.'.$file->getClientOriginalName(); $file->storeAs('public', $filename); $detalleTicket->file = $filename; } $detalleTicket->save(); Session::flash('success'); return redirect()->route('detalles-tickets.view'); }- 调整download方法的文件读取逻辑:
public function download($file){ return Storage::download('public/'.$file); } - 先执行Laravel默认的存储软链接创建命令:
- 确认
public/storage目录的读写权限正常,web运行用户拥有该目录的读取权限。
内容的提问来源于stack exchange,提问作者matuco1998
相关产品推荐
相关产品推荐

