Laravel 8 如何获取存储在storage文件夹中图片的访问URL?
解决Laravel 8自定义存储磁盘图片访问404问题
你遇到的问题是因为Web服务器没有将你配置的/collectible/image路径映射到对应的存储目录,下面给你两种可行的解决方案:
方案一:使用Laravel默认的存储符号链接(推荐)
Laravel提供了专门的命令来创建符号链接,让Web服务器可以直接访问storage/app/public下的文件,这是官方推荐的方式。
首先运行Artisan命令创建符号链接:
php artisan storage:link这个命令会把
storage/app/public目录链接到项目根目录的public/storage文件夹,Web服务器就能直接访问这个目录下的文件了。修改你的磁盘配置中的
url项,匹配符号链接后的路径:'public_collectible_img' => [ 'driver' => 'local', 'root' => storage_path('app/public/collectibles_img'), 'url' => env('APP_URL').'/storage/collectibles_img', 'visibility' => 'public', ],现在你可以通过这个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的访问路径,可以通过添加路由来代理请求到存储目录:
在
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); });现在你之前的URL
http://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
相关产品推荐
相关产品推荐

