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

Laravel项目Storage无法显示图片,已创建符号链接求排查

问题排查与解决方案

我来帮你拆解这个问题,看了你的代码和描述,核心问题大概率出在文件路径存储格式与URL生成逻辑不匹配上,导致浏览器请求的图片路径不存在,所以只显示缩略图占位。咱们一步步来排查修复:

1. 数据库存储的路径格式错误

你的store和update方法里,使用$request->company_avatar->store('public')时,Laravel会返回类似public/abc123.jpg的完整相对路径(相对于storage/app目录)。但当你用Storage::disk('public')->url($data->company_avatar)生成URL时,public磁盘的根目录是storage/app/public,所以它会把public/abc123.jpg拼接成/storage/public/abc123.jpg——但实际文件是存在storage/app/public/abc123.jpg,而你的符号链接public/storage指向的是storage/app/public,所以正确的URL应该是/storage/abc123.jpg,多出来的public/前缀直接导致了404错误。

修复方法:

修改store和update方法,存储相对于public磁盘的路径(也就是去掉public/前缀):

// store方法里的修改
if ($request->hasFile('company_avatar')) {
    // 第二个参数指定磁盘为public,第一个参数留空表示存在public磁盘的根目录
    $imageName = $request->company_avatar->store('', 'public');
}

// update方法同理
if ($request->hasFile('company_avatar')) {
    $imageName = $request->company_avatar->store('', 'public');
}

这样存储到数据库的company_avatar字段值就是abc123.jpg,调用Storage::disk('public')->url($data->company_avatar)就会生成正确的/storage/abc123.jpg。

如果你想把图片存在public磁盘的子目录(比如avatars),可以改成:

$imageName = $request->company_avatar->store('avatars', 'public');

这时候数据库存的是avatars/abc123.jpg,URL会是/storage/avatars/abc123.jpg,对应文件存在storage/app/public/avatars/abc123.jpg,也是完全正确的。

2. 确认符号链接是否正确创建

虽然你说已经创建,但再验证一下:

  • 在项目根目录执行命令:php artisan storage:link
  • 检查项目的public目录下是否有storage符号链接(Linux/macOS是蓝色的链接,Windows是快捷方式),指向../storage/app/public。如果是Windows系统,可能需要用管理员权限运行命令行,或者手动创建快捷方式。

3. 检查文件权限

确保storage/app/public目录和里面的图片文件有可读权限:

  • Linux/macOS执行:chmod -R 755 storage/
  • 确保web服务器的运行用户(比如www-data、nginx)有访问该目录的权限。

4. 验证生成的URL是否正确

在Blade视图里临时输出URL,确认路径是否正确:

{{-- 临时添加这行,查看生成的URL --}}
<p>Generated URL: {{ Storage::disk('public')->url($data->company_avatar) }}</p>
<img class="profile-user-img img-fluid img-circle" src="{{ Storage::disk('public')->url($data->company_avatar) }}" alt="User profile picture">

把生成的URL复制到浏览器地址栏,如果返回404,就对应上面的路径问题;如果能打开图片,那可能是CSS样式或者浏览器缓存的问题,可以尝试清空浏览器缓存再刷新。

额外小优化:

你的update方法还有个小隐患:如果用户更新时没有上传新图片,$imageName变量会未定义,导致覆盖数据库里的旧路径。可以修改成:

public function update(Request $request, $id) {
    $data = Tbl_logo::find($id);
    // 只有上传了新图片才更新路径
    if ($request->hasFile('company_avatar')) {
        $imageName = $request->company_avatar->store('', 'public');
        $data->company_avatar = $imageName;
    }
    $data->company_name = $request->company_name;
    $data->save();
    return redirect('admin/logo');
}

这样避免没上传图片时清空旧的头像路径。

内容的提问来源于stack exchange,提问作者Neeraj Tangariya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 08:42:39