Laravel 5 - 如何在视图中访问存储上传的图片?
Laravel 5 - 如何在视图中访问存储上传的图片?
我已将用户的头像上传到Laravel存储中。我如何访问它们并在视图中呈现它们?
服务器将所有请求指向“/public”,所以如果它们位于“/storage”文件夹中,我如何显示它们?
admin 更改状态以发布 2023年5月19日
一种选择是在您的存储目录和公共目录之间创建一个子文件夹的符号链接。
例如
ln -s /path/to/laravel/storage/avatars /path/to/laravel/public/avatars
这也是 Envoyer 所使用的方法,Envoyer 是 Laravel 的开发者 Taylor Otwell 创建的一个部署管理器。
最好的方法是创建一个符号链接,就像@SlateEntropy在下面的回答中非常明确的指出的。为了帮助您,自5.3版本以来,Laravel包括一个命令,使此过程变得非常容易:
php artisan storage:link
这将为您创建一个符号链接,从public/storage
到storage/app/public
。现在,任何在/storage/app/public
中的文件都可以通过链接访问,例如:
http://somedomain.com/storage/image.jpg
如果由于任何原因,您无法创建符号链接(可能是由于您在共享主机上等等),或者您想保护某些文件的访问权限,那么有一个特殊的路由可以读取和提供图像文件。例如,可以使用这样一个简单的闭包路由:
Route::get('storage/{filename}', function ($filename) { $path = storage_path('public/' . $filename); if (!File::exists($path)) { abort(404); } $file = File::get($path); $type = File::mimeType($path); $response = Response::make($file, 200); $response->header("Content-Type", $type); return $response; });
现在,您可以像使用符号链接一样访问您的文件:
http://somedomain.com/storage/image.jpg
如果您使用Intervention Image Library,您可以使用其内置的response
方法使事情更加简洁:
Route::get('storage/{filename}', function ($filename) { return Image::make(storage_path('public/' . $filename))->response(); });
警告
请记住,手动提供文件会产生性能损失,因为您需要通过整个Laravel请求生命周期来读取和发送文件内容,这比让HTTP服务器处理它要慢得多。
抱歉,该任务无法完成,因为缺少需要翻译的内容。请提供正确的内容。