
在 Laravel 8 中,即使图片已成功上传至 storage/app/public/,若未正确建立 public/storage 符号链接,浏览器将无法通过 URL 访问存储的文件;本文提供无需终端权限的兼容方案。
在 laravel 8 中,即使图片已成功上传至 storage/app/public/images/,若未正确建立 public/storage 符号链接,浏览器将无法通过 url 访问存储的文件;本文提供无需终端权限的兼容方案。
在 Laravel 中,storage/app/public/ 目录下的文件默认不会自动对外可访问,必须通过 php artisan storage:link 命令在 public/ 目录下创建指向 storage/app/public/ 的符号链接(即 public/storage → storage/app/public)。该链接是 Laravel 官方推荐的静态资源公开路径,所有通过 asset() 或直接 URL 访问 /storage/... 的请求,都依赖此链接存在。
但你在共享主机环境下无法执行 Artisan 命令(无 SSH、无终端),因此不能常规运行 storage:link。此时,一个安全且被广泛验证的替代方案是:在路由中临时触发 Artisan 命令并手动执行链接创建。
✅ 正确做法(适用于生产环境 & 无 CLI 权限场景):
-
在 routes/web.php 中添加临时路由(建议部署后立即注释或删除,避免安全风险):
// ⚠️ 仅临时使用!上线后务必移除或加权限保护 use Illuminate\Support\Facades\Artisan; use Illuminate\Support\Facades\Route;
Route::get('/storage-link', function () { Artisan::call('storage:link'); return 'Storage linked successfully. You may now delete this route.'; });
2. **访问该路由一次**(例如打开 `https://sitename.com/storage-link`)——系统将自动创建 `public/storage` 符号链接。
3. **更新视图中的图片路径**(关键!不要用完整物理路径):
```blade
{{-- ✅ 正确:使用 Laravel 的 asset() 辅助函数(推荐) --}}
@@##@@image_path) }}" alt="{{ $product->name }}">
{{-- 或 ✅ 手动拼接(确保以 /storage/ 开头) --}}
@@##@@image_path }}" alt="{{ $product->name }}">
⚠️ 注意:/storage/ 是符号链接的URL 路径前缀,对应服务器上 public/storage/ 目录,而 public/storage/images/xxx.jpg 实际指向 storage/app/public/images/xxx.jpg。
? 验证是否成功:
- 检查服务器 public/ 目录下是否存在 storage 文件夹(应为快捷方式/符号链接);
- 直接访问 https://sitename.com/storage/images/test.jpg,若图片正常加载,则配置成功。
? 补充说明:
- 此方法仅需一次执行,链接创建后永久生效(除非手动删除);
- 不要使用 storage/app/public/ 的绝对 URL(如 https://sitename.com/storage/app/public/...),这会绕过 Laravel 路由且通常被 Web 服务器拒绝;
- 若后续仍 404,请检查 Web 服务器(如 Apache/Nginx)是否允许 public/storage 目录被公开访问(共享主机一般默认允许);
- 安全提醒:生产环境切勿长期保留 /storage-link 路由,建议执行后立即注释或配合 IP 限制(如 request()->ip() === 'your-ip')。
完成以上步骤后,图片即可在视图中正常显示。











