
asset() 仅解析 public/ 目录下的文件;若图片存于 storage/app/public/,需先执行 php artisan storage:link 创建符号链接,再通过 /storage/ 路径访问,而非直接写 public/images/。
`asset()` 仅解析 `public/` 目录下的文件;若图片存于 `storage/app/public/`,需先执行 `php artisan storage:link` 创建符号链接,再通过 `/storage/` 路径访问,而非直接写 `public/images/`。
在 Laravel 应用中,asset() 是一个核心辅助函数,用于生成指向 public/ 目录下静态资源(如 CSS、JS、图片)的绝对 URL。其本质是将传入路径直接拼接到应用根 URL 后,不进行任何服务器端路径映射或文件存在性校验。例如:
{{ asset('css/app.css') }}
{{-- 输出:https://yoursite.com/css/app.css --}}这意味着:asset() 只认 public/ 目录为“根”,它不会自动穿透到 storage/ 或其他目录。因此,当你写:
@@##@@picture) }}">
Laravel 实际尝试访问的是 public/images/xxx.jpg —— 但如果你的图片实际存储在 storage/app/public/images/xxx.jpg,该路径在 public/ 下并不存在,浏览器自然无法加载。
✅ 正确做法是利用 Laravel 内置的「公共存储磁盘」(public disk)机制:
- 确保图片已保存至 storage/app/public/(例如使用 Storage::disk('public')->putFile('images', $request->file('picture')));
-
运行命令创建符号链接:
php artisan storage:link
该命令会在 public/ 目录下创建名为 storage 的软链接,指向 storage/app/public/;
-
在 Blade 中通过 /storage/ 前缀引用:
@@##@@picture) }}">
此时,asset('storage/images/xxx.jpg') 生成的 URL 为 https://yoursite.com/storage/images/xxx.jpg,Web 服务器(如 Nginx/Apache)会将 /storage 路径路由到 storage/app/public/,从而成功返回图片。
⚠️ 注意事项:
- storage:link 只需运行一次(部署时),且要求 Web 服务器用户对 public/storage 有读取权限;
- 不要手动复制 storage/app/public 到 public/ —— 这会丢失动态性且难以维护;
- 检查 config/filesystems.php 中 links 配置项,确认 public/storage 映射是否启用(默认已配置);
- 开发环境(如 Laravel Valet、Homestead)和生产环境均需确保符号链接存在且有效。
总结:asset() 是纯前端路径生成器,不负责后端文件定位;Laravel 的存储分层设计(storage/app/ + public/storage 符号链接)兼顾了安全性与便利性。理解这一机制,才能避免“图片不显示”的常见陷阱。










