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

Laravel线上环境Storage图片加载异常问题求助

问题解决思路

核心问题定位

你的数据库存储的路径是storage/uploads/my-folder-name/file.jpg,但实际可访问的路径是storage/app/public/uploads/my-folder-name/file.jpg,结合filesystem配置来看:

  • local盘根目录为storage/app,文件存在storage/app/uploads/下,不在软链接指向的storage/app/public范围内,线上环境无法公开访问
  • public盘根目录为storage/app/public,对应软链接public/storage,只有此目录下的文件才能通过APP_URL/storage/...访问

分步解决方案

1. 修正文件上传逻辑

确保上传图片时使用public磁盘,而非默认的local磁盘:

// 错误:用local盘,文件存storage/app/uploads/
Storage::put('uploads/my-folder-name/file.jpg', $file);

// 正确:用public盘,文件存storage/app/public/uploads/
Storage::disk('public')->put('uploads/my-folder-name/file.jpg', $file);

2. 修正数据库存储路径

数据库应存储相对于public盘的路径(即uploads/my-folder-name/file.jpg),而非带storage/前缀的路径。在Yajra Datatable中生成链接时用Laravel内置方法:

$imageUrl = Storage::disk('public')->url($row->image_path);
// 输出链接格式:APP_URL/storage/uploads/my-folder-name/file.jpg

若不想修改现有数据库数据,可在读取时补全路径:

$imageUrl = url('storage/' . str_replace('storage/', '', $row->image_path));

3. 线上环境软链接验证

  • 确认线上执行过软链接创建命令,若已创建失败则重建:
    rm public/storage
    php artisan storage:link
    
  • 若共享主机不支持软链接,直接复制目录替代:
    cp -r storage/app/public public/storage
    
  • 检查权限,确保目录和文件可被服务器访问:
    chmod -R 755 storage/app/public
    chmod -R 644 storage/app/public/uploads
    

4. 验证环境变量配置

确保线上APP_URL环境变量正确设置,public盘的url配置会基于此生成合法访问链接:

APP_URL=https://your-production-domain.com

补充说明

本地环境能显示是因为本地服务器(如Artisan Serve、Valet)可直接访问storage目录,但线上生产服务器仅开放public目录访问,必须通过软链接映射storage/app/public到public/storage才能实现公开访问。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 08:25:23