You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel 8 如何获取存储在storage文件夹中图片的访问URL?

解决Laravel 8自定义存储磁盘图片访问404问题

你遇到的问题是因为Web服务器没有将你配置的/collectible/image路径映射到对应的存储目录,下面给你两种可行的解决方案:

方案一:使用Laravel默认的存储符号链接(推荐)

Laravel提供了专门的命令来创建符号链接,让Web服务器可以直接访问storage/app/public下的文件,这是官方推荐的方式。

  1. 首先运行Artisan命令创建符号链接:

    php artisan storage:link
    

    这个命令会把storage/app/public目录链接到项目根目录的public/storage文件夹,Web服务器就能直接访问这个目录下的文件了。

  2. 修改你的磁盘配置中的url项,匹配符号链接后的路径:

    'public_collectible_img' => [
        'driver' => 'local',
        'root' => storage_path('app/public/collectibles_img'),
        'url' => env('APP_URL').'/storage/collectibles_img',
        'visibility' => 'public',
    ],
    
  3. 现在你可以通过这个URL访问图片:

    http://localhost/my_project/public/storage/collectibles_img/1.jpg
    

    也可以用Laravel的方法自动生成正确URL,避免手动拼接出错:

    $imageUrl = Storage::disk('public_collectible_img')->url($file_name);
    

方案二:保留自定义URL,添加路由代理请求

如果你想继续使用/collectible/image/xxx.jpg的访问路径,可以通过添加路由来代理请求到存储目录:

  1. 在routes/web.php中添加以下路由:

    Route::get('/collectible/image/{filename}', function ($filename) {
        // 构建图片的实际存储路径
        $filePath = storage_path('app/public/collectibles_img/' . $filename);
        
        // 如果文件不存在,返回404
        if (!file_exists($filePath)) {
            abort(404);
        }
        
        // 获取文件的MIME类型,确保浏览器正确解析
        $mimeType = mime_content_type($filePath);
        // 返回文件响应
        return response(file_get_contents($filePath))->header('Content-Type', $mimeType);
    });
    
  2. 现在你之前的URLhttp://localhost/my_project/public/collectible/image/1.jpg就能正常访问图片了。

为什么之前的URL会404?

你配置的磁盘url参数只是Laravel生成URL时的前缀,但Web服务器(比如Apache/Nginx)并不知道这个前缀对应到storage/app/public/collectibles_img目录,所以要么通过符号链接让Web服务器直接访问,要么通过Laravel路由来转发请求读取文件。

内容的提问来源于stack exchange,提问作者Carol.Kar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 17:17:31