如何在 Laravel 中正确加载 Storage 存储的用户头像图片
技术百科
霞舞
发布时间:2026-01-22
浏览: 次 本文详解 laravel 中使用 `storage:link` 后仍无法通过 `asset()` 加载 `storage/app/public/` 下图片的常见原因,并提供完整解决方案,包括路径修正、url 生成逻辑、权限检查及安全建议。
在 Laravel 中,将用户上传或 Seeder 生成的图片存入 storage/app/public/ 目录(如 storage/app/public/users/xxx.jpg)是标准做法,但直接用 asset('storage/users/xxx.jpg') 加载会失败——这不是路径写错,而是对 Laravel 资源机制的理解偏差。
? 根本原因:asset() 只解析 public/ 目录下的文件
Laravel 的 asset() 辅助函数仅支持从 public/ 目录及其子目录中引用静态资源(如 CSS、JS、图片)。它不会穿透到 storage/ 目录,即使你已执行 php artisan storage:link 创建了符号链接(该命令本质是将 public/storage → storage/app/public),正确的访问路径也必须以 storage/ 开头(即 public/storage/...),而非 storage/...。
你当前的 img 标签:
@@##@@image) }}" ...>
生成的 URL 是类似 /storage/users/123.jpg

✅ 正确做法:确保路径纯净 + 使用 Storage::url()
1. 工厂/Seeder 中保存路径要「相对」且「无前缀」
// ❌ 错误:faker->image() 写入绝对路径,且含 'storage/app/public/'
'image' => $this->faker->image('storage/app/public/users', 140, 180, null, false),
// ✅ 正确:只指定相对子路径(Laravel 自动存入 storage/app/public/)
'image' => $this->faker->image('users', 140, 180, null, false), // 生成如: users/abc.jpg这样数据库中存储的 image 字段值就是 users/abc.jpg,不带 storage/app/public/ 前缀。
2. Blade 中使用 Storage::url() 生成安全 URL(推荐)
@use('Illuminate\Support\Facades\Storage')
@@##@@image) }}"
class="avatar avatar-sm me-3 border-radius-lg"
alt="user avatar">✅ Storage::url() 会自动拼接为 /storage/users/abc.jpg(对应 public/storage/users/abc.jpg 符号链接),且支持云存储驱动无缝切换。
? 补充:若坚持用 asset(),需手动补全 storage/ 前缀,且确保 $user->image 不含重复路径:
3. 验证符号链接是否生效
运行以下命令确认链接存在且可读:
ls -la public/storage # 应输出类似:storage -> ../storage/app/public
同时检查 storage/app/public/users/ 下图片是否存在,且 Web 服务器(Nginx/Apache)有读取权限。
⚠️ 注意事项与最佳实践
- 不要将图片直接存入 public/:违背 Laravel 安全约定,storage/app/public/ + storage:link 才是官方推荐方式;
- 避免硬编码路径:使用 Storage::url() 或 Storage::disk('public')->url() 更健壮;
- Seeder 中确保磁盘配置正确:确认 config/filesystems.php 中 public 磁盘的 root 指向 storage_path('app/public');
- 生产环境注意缓存:修改后运行 php artisan config:clear 和 php artisan view:clear。
✅ 总结
问题核心在于混淆了 asset() 的作用域(仅限 public/ 目录)与 storage:link 的映射逻辑(public/storage/ → storage/app/public/)。只需两步即可解决:
① 工厂中用 faker->image('users', ...) 保存相对路径;
② Blade 中用 Storage::url($user->image) 生成 URL。
从此告别 404,让头像稳稳加载。
# app
# css
# public
# js
# 编码
# 作用域
# cad
# php
# apache
# nginx
# laravel
# 云存储
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- 如何在Golang中使用闭包_封装变量与函数作用域
- Python正则表达式实战_模式匹配说明【教程】
- 如何使用Golang实现微服务事件驱动_使用消息总
- c++ try_emplace用法_c++ map
- Mac怎么安装软件_Mac安装dmg与pkg文件的
- c# await 一个已经完成的Task会发生什么
- php高频调试功能有哪些_php常用调试函数与工具
- 微信短链接怎么还原php_用浏览器开发者工具抓包获
- 如何在 Go 开发中正确处理本地包导入与远程模块路
- php下载安装后memory_limit怎么设置_
- php下载安装后swoole扩展怎么安装_异步框架
- 如何使用正则表达式批量替换重复的“-”模式为固定字
- 如何在Golang中引入测试模块_Golang测试
- Python深度学习实战教程_神经网络模型构建与训
- 如何在包含多值的列中精准搜索指定演员?
- windows如何禁用驱动程序强制签名_windo
- 微信JSAPI支付回调PHP怎么接收_处理JSAP
- Windows蓝屏BAD_POOL_HEADER故
- Win11怎么查看显卡显存_查询Win11显卡详细
- 如何在Golang中实现WebSocket广播_使
- c++怎么使用std::tuple存储多元组数据_
- 如何在Golang中实现自定义Benchmark_
- PHP中require语句后直接调用返回对象方法的
- Windows10如何查看蓝屏日志_Win10使用
- 如何在同包不同文件中正确引用 Go 结构体
- Win11怎么关闭自动调节亮度 Win11禁用内容
- Win11怎么关闭自动修复_跳过Win11开机自动
- Python配置文件操作教程_JSONINIYAM
- 如何在 Go 项目开发中正确处理本地包导入与远程模
- Windows10电脑怎么设置电源按钮_Win10
- XSLT怎么生成动态的HTML属性名和标签名
- 如何在Golang中处理模块冲突_解决依赖版本不兼
- Win11怎么更改默认打开方式_Win11关联文件
- Python数据挖掘进阶教程_分类回归与聚类案例解
- Windows如何设置登录时的欢迎屏幕背景?(锁屏
- 如何用::实现工具类方法调用_php静态工具类设计
- php怎么下载安装后设置错误日志_phpini l
- Python对象比较排序规则_集合使用说明【指导】
- Win10怎么卸载鲁大师_Win10彻底卸载鲁大师
- Windows10系统怎么查看硬盘健康_Win10
- Win11怎么更改管理员名字 Win11修改账户名
- Python文件管理规范_工程实践说明【指导】
- 为什么Go需要go mod文件_Go go mod
- mac怎么安装pip_MAC Python pip
- Win11怎么卸载Photos应用_Win11卸载
- Win11怎么查看已连接wifi密码 Win11查
- Win11开机Logo怎么换_Win11自定义启动
- Win11怎么设置开机自动连接宽带_Windows
- Python装饰器复用技巧_通用能力解析【教程】
- Mac怎么设置鼠标滚动速度_Mac鼠标设置详细参数

QQ客服