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
相关产品推荐
相关产品推荐

