

Laravel上传图片404与public_storage目录联接(Junction)原理经验总结
售价
¥1090.00
热门推荐
商品详情
商品名称:
Laravel 上传图片成功了,数据库里也存了路径,但浏览器一访问图片直接 404 Not Found——这是 Laravel 开发者最常踩的坑之一。
01
为什么会 404
Laravel 的文件默认存储在 storage/app/public 目录下,但这个目录在 public 目录之外,Nginx/Apache 根本访问不到。上传是成功的,文件也在磁盘上,只是 Web 服务器的文档根目录里没有这个路径。
02
官方解法:storage:link
Laravel 提供了 php artisan storage:link 命令,本质是在 public 目录下创建一个叫 storage 的软链接,指向 storage/app/public。
public/storage → storage/app/public
这样访问/storage/xxx.jpg就等于访问 storage/app/public/xxx.jpg。
03
Windows 上的坑:软链接变 Junction
在 Windows 上跑 storage:link,PHP 会调用 PHP 的 symlink 函数。NTFS 不支持真正的 POSIX 软链接,所以 Laravel 用的是 Junction(目录联接)。Junction 是 NTFS 重解析点的一种,对应用层完全透明——你 cd 进去、读文件、写文件,跟操作真目录没有任何区别。
所以在 Windows 上看到 public/storage 是一个 Junction 而不是符号链接,这是正常的,不影响使用。
04
还报 404?检查这几点
① public/storage 目录是否存在?不存在就重新跑 storage:link
② config/filesystems.php 里 public disk 的 root 是否指向 storage/app/public
③ Web 服务器是否把请求转发给了 public 目录而不是项目根目录
一句话总结:上传404不是文件没存,是Web服务器找不到路径——storage:link 用 Junction 把 storage/app/public 映射到 public/storage,问题就解决了。