Laravel使用store方法上传的图片通过符号链接访问报404如何解决
现象说明
该情况属于正常现象,不存在底层配置错误。
问题诱因
- Laravel 默认将非公开存储文件放在
storage/app目录下,执行php artisan storage:link命令的作用是在web入口目录(项目根目录下的public文件夹)创建软链接storage,指向storage/app/public,因此文件系统路径storage/app/public/avatar/xxx.jpg对应的web访问路径为域名/storage/avatar/xxx.jpg。 - 你当前调用
store方法时未指定存储磁盘,默认使用local磁盘,该磁盘的根目录为storage/app。传入public/avatar作为保存目录时,实际存储路径为storage/app/public/avatar/xxx.jpg,返回的路径是相对于local磁盘根目录的public/avatar/xxx.jpg,该路径是文件系统的相对路径,不能直接作为web访问路径使用。
解决方法
方法1(推荐):存储时指定public磁盘,用官方方法生成访问链接
修改存储代码,显式指定使用public磁盘存储:
$path = $request->file('avatar')->store('avatar', 'public');
此时返回的$path为avatar/xxx.jpg,需要生成前端可访问的链接时,调用Storage门面的url方法即可:
$accessUrl = Storage::url($path); // 输出结果为 /storage/avatar/xxx.jpg,直接传给前端即可正常访问
方法2:兼容现有存储逻辑,手动替换路径前缀
如果不想修改现有存储逻辑,拿到带public/前缀的路径后,手动替换前缀生成访问路径即可:
$accessPath = str_replace('public/', 'storage/', $path); $accessUrl = asset($accessPath);
注意事项
如果替换路径后仍出现404,可检查项目根目录下的public文件夹内是否存在正常的storage软链接:Windows环境下执行storage:link命令需要开启开发者权限,否则可能生成普通文件夹而非软链接,也会导致资源访问失败。
内容的提问来源于stack exchange,提问作者Ashkan
相关产品推荐
相关产品推荐

