Laravel 8项目图片无法显示 访问返回404问题求助
问题根因
两个独立问题叠加导致故障:
- 图片上传逻辑写错:存储文件时未正确将上传临时文件写入目标路径,错误将图片名作为目录创建,仅把上传生成的
.tmp临时文件放入该目录,对应你看到的「图片变文件夹」现象。 - 软链配置与你隐藏public目录的重写规则冲突:Laravel默认
php artisan storage:link生成的软链基于public目录,你自定义的软链路径存在错误,且旧的失效软链不会被重复执行的命令自动覆盖,再加.htaccess规则未放行真实文件路径,最终导致图片请求返回404。
分步修复方案
第一步:修正文件上传逻辑
你当前的上传代码大概率是传错了move/store方法的参数,才会生成错误的目录+tmp文件结构,参考适配public磁盘的正确写法:
// 先手动删除之前生成的错误文件:包括storage/app下的uploads目录、public目录下所有和图片同名的文件夹,避免路径冲突 $fileName = time() . $request->file('photo')->getClientOriginalName(); // 将文件存入 storage/app/public/uploads/posts 目录,使用public磁盘控制权限 $request->file('photo')->storeAs('uploads/posts', $fileName, 'public'); // 前端输出图片地址时直接调用asset方法,不要手动拼接路径 $imgUrl = asset('storage/uploads/posts/' . $fileName);
第二步:重新生成适配目录结构的软链
- 删掉
filesystems.php中links项里你自定义的uploads软链配置,保留默认配置即可:'links' => [ public_path('storage') => storage_path('app/public'), ], - 进入项目public目录,手动删除之前生成的名为
storage的失效软链/快捷方式。 - 由于你是Windows环境,不要直接跑默认的storage:link命令(容易生成路径错误的软链),在项目根目录终端执行对应命令生成目录联接:
CMD环境执行:
PowerShell环境执行:mklink /J "public\storage" "storage\app\public"New-Item -ItemType Junction -Path "public\storage" -Target "storage\app\public" - 生成完成后进入public/storage目录,确认能看到uploads/posts的层级结构、以及你上传的正常图片文件即可。
第三步:修正根目录.htaccess重写规则
你当前的重写规则没有放行真实存在的文件/软链请求,会把图片请求错误转发到public/index.php导致404,将根目录.htaccess内容替换为以下规则:
<IfModule mod_rewrite.c> RewriteEngine On # 真实存在的文件、目录、软链直接访问,不做重写 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-l # 其余请求转发到public目录 RewriteRule ^(.*)$ public/$1 [L] </IfModule>
验证方式
重新上传一张测试图片,直接访问http://localhost/laravel/blog/storage/uploads/posts/测试图片文件名,能正常打开图片即表示配置生效,前端页面统一用asset('storage/对应文件路径')输出图片地址即可。
内容的提问来源于stack exchange,提问作者php_man
相关产品推荐
相关产品推荐

