You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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:走控制器返回下载响应(适合非公开资源)

如果文件不希望对外公开,可单独新增下载路由,由控制器鉴权后返回下载响应:

  1. 新增路由(示例):
Route::get('assets/download/{id}', [AssetController::class, 'download'])->name('assets.download');
  1. 控制器新增下载方法:
public function download($_id)
{
    $asset = Asset::findorFail($_id);
    $path = storage_path('app/public/'.$_id.'.png');
    // 可在此处添加自定义鉴权逻辑
    return response()->download($path);
}
  1. 修改模板a标签:
<a href="{{ route('assets.download', $asset->_id) }}" download>{{$qrCode}}</a>

额外注意事项

路径书写时统一使用正斜杠/,避免混合使用反斜杠\,防止部署到Linux服务器时出现路径解析错误。

内容的提问来源于stack exchange,提问作者Tayyab

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 10:54:03