
asset() 函数仅生成指向 public/ 目录的 URL,无法直接访问 storage/app/public 下的文件;需通过 php artisan storage:link 创建符号链接,并统一使用 /storage/... 路径调用 asset() 才能正常显示资源。
`asset()` 函数仅生成指向 `public/` 目录的 url,无法直接访问 `storage/app/public` 下的文件;需通过 `php artisan storage:link` 创建符号链接,并统一使用 `/storage/...` 路径调用 `asset()` 才能正常显示资源。
在 Laravel 应用中,asset() 是一个常用辅助函数,用于生成指向 public/ 目录下静态资源的绝对 URL(如 )。它的底层逻辑非常明确:所有传入的路径都会被拼接到应用的根 public/ 目录 URL 后,且不进行任何文件存在性检查或路径映射转换。
因此,当你写:
@@##@@picture) }}">
Laravel 实际生成的是类似 https://yoursite.com/images/avatar.jpg 的 URL,浏览器会尝试从 public/images/ 目录加载该文件——但若你的图片实际存放在 storage/app/public/images/(这是 Laravel 推荐的用户上传文件存储位置),则该路径必然 404。
✅ 正确做法是利用 Laravel 内置的「公共存储链接」机制:
-
确保已运行符号链接命令(仅需执行一次,部署后也建议检查):
php artisan storage:link
该命令会在 public/ 目录下创建名为 storage 的符号链接,指向 storage/app/public/。此时,public/storage/images/avatar.jpg 等价于 storage/app/public/images/avatar.jpg。
-
在 Blade 模板中统一使用 /storage/ 前缀调用 asset():
@@##@@picture) }}" alt="User avatar">
此时 asset() 生成的 URL 为 https://yoursite.com/storage/images/avatar.jpg,Nginx/Apache 会通过符号链接成功定位到真实文件。
⚠️ 注意事项:
- 不要手动复制文件到 public/images/ —— 这违背 Laravel 的文件系统抽象设计,且难以管理权限、CDN 集成和多环境同步;
- config/filesystems.php 中的 'links' 配置定义了哪些符号链接会被 storage:link 命令创建,默认即包含 'public/storage' => '../storage/app/public';
- 若使用云存储(如 S3),应改用 Storage::url() 生成签名 URL,而非 asset();
- 开发环境启用 storage:link 后,务必在生产部署脚本中加入该命令(或确保其已执行),否则静态资源将全部失效。
? 总结:asset() 是纯前端路径构造工具,不是文件系统路由器。它只认 public/ 下的物理(或符号链接)路径。合理使用 storage:link + asset('storage/...') 组合,既能保持 Laravel 文件系统约定,又能安全、高效地提供用户上传资源的 Web 访问能力。










