Laravel 8中无法下载Storage文件夹内存储的文件问题排查
问题根因
你混淆了服务器本地文件路径和Web可访问URL路径的使用场景:
storage_path()函数返回的是服务器磁盘的本地绝对路径(对应file://协议),浏览器出于安全策略限制,禁止网页从HTTP/HTTPS协议上下文跳转访问本地file://协议的资源,这就是点击下载无响应的直接原因。- 你本地直接在地址栏输入路径可以打开,是因为开发环境下服务端和客户端是同一台设备,部署到线上后普通用户完全无法通过该路径访问到文件。
修复方案
方案1:使用公开访问路径(推荐用于公开资源)
Laravel的storage/app/public目录默认需要通过软链接映射到web根目录的public/storage才能对外访问,先确认你已经在项目根目录执行过命令创建软链接:
php artisan storage:link
之后修改asset.blade.php中的a标签代码,将storage_path()替换为生成web可访问URL的asset()函数:
<a href="{{ asset('storage/'.$asset->_id.'.png') }}" download>{{$qrCode}}</a>
方案2:走控制器返回下载响应(适合非公开资源)
如果文件不希望对外公开,可单独新增下载路由,由控制器鉴权后返回下载响应:
- 新增路由(示例):
Route::get('assets/download/{id}', [AssetController::class, 'download'])->name('assets.download');
- 控制器新增下载方法:
public function download($_id) { $asset = Asset::findorFail($_id); $path = storage_path('app/public/'.$_id.'.png'); // 可在此处添加自定义鉴权逻辑 return response()->download($path); }
- 修改模板a标签:
<a href="{{ route('assets.download', $asset->_id) }}" download>{{$qrCode}}</a>
额外注意事项
路径书写时统一使用正斜杠/,避免混合使用反斜杠\,防止部署到Linux服务器时出现路径解析错误。
内容的提问来源于stack exchange,提问作者Tayyab
相关产品推荐
相关产品推荐

