
在 laravel 8 中,即使图片已成功上传至 storage/app/public/images/,因缺少 public/storage 符号链接,浏览器无法通过 url 访问存储文件;本文提供无需终端权限的纯 web 端修复方案。
在 laravel 8 中,即使图片已成功上传至 storage/app/public/images/,因缺少 public/storage 符号链接,浏览器无法通过 url 访问存储文件;本文提供无需终端权限的纯 web 端修复方案。
Laravel 的 storage:link 命令用于在 public/ 目录下创建指向 storage/app/public/ 的符号链接(即 public/storage → storage/app/public),这是 Laravel 官方推荐的静态资源公开访问机制。但在共享主机等无 SSH 或 Artisan 权限的生产环境中,直接执行 php artisan storage:link 不可行。
所幸,Laravel 允许通过 Web 路由动态调用 Artisan 命令(需谨慎启用)。你可在 routes/web.php 中添加以下临时路由:
// routes/web.php
use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\Route;
Route::get('/storage', function () {
Artisan::call('storage:link');
return 'Storage symlink created successfully. You may now delete this route.';
})->middleware('auth'); // 强烈建议添加认证中间件(如仅管理员可访问)
✅ 操作步骤:
- 将上述代码追加到 routes/web.php 文件末尾;
- 在浏览器中访问 https://yoursite.com/storage(确保你已登录并满足中间件权限);
- 页面将显示成功提示,此时 public/storage 已正确链接至 storage/app/public;
- 立即删除或注释掉该路由,避免安全风险(长期暴露 Artisan 调用接口可能导致未授权命令执行)。
随后,在 Blade 视图中使用 Laravel 的 asset() 辅助函数生成安全、适配环境的 URL:
Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
<!-- 正确写法:自动解析为 /storage/images/filename.jpg -->
@@##@@image_path) }}"
alt="{{ $product->name }}"
width="300">
⚠️ 重要注意事项:
- asset('storage/...') 对应的是 public/storage/... 路径,而 public/storage 指向 storage/app/public,因此实际文件应存放于 storage/app/public/images/;
- 若此前图片误传至 storage/app/public/images/,但 URL 写成 storage/app/public/images/...,则路径冗余——请统一使用 asset('storage/images/xxx');
- 该方案为临时应急措施,长期建议与主机商确认是否支持 ln -s 或迁移至支持 SSH 的托管环境;
- 生产环境切勿保留未保护的 Artisan 调用路由,防止潜在安全漏洞。
至此,图片即可正常加载。核心在于建立正确的符号链接路径,并通过 asset() 函数生成标准化 URL,而非手动拼接完整服务器路径。










