Laravel 5 – 如何访问视图中的存储上传的图像?
我有用户的头像上传到Laravel存储。 我怎样才能访问它们并在视图中渲染它们?
服务器正在将所有请求指向/public
,所以如何将它们显示在/storage
文件夹中?
最好的方法是创build一个像@SlateEntropy这样的符号链接 ,在下面的答案中非常好的指出。 为了帮助解决这个问题,从5.3版开始,Laravel提供了一个令人难以置信的简单命令 :
php artisan storage:link
这为您创build了从public/storage
到storage/app/public
的符号链接,这就是它的全部。 现在/storage/app/public
任何文件都可以通过如下链接访问:
http://somedomain.com/storage/image.jpg
如果出于任何原因,你不能创build符号链接(也许你在共享主机等),或者你想保护一些访问控制逻辑背后的文件,有一个特殊的路线读取和为图像服务。 例如这样一个简单的closures路由:
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
如果您正在使用干预图像库 ,则可以使用其内置的response
方法来使事情更加简洁:
Route::get('storage/{filename}', function ($filename) { return Image::make(storage_path('public/' . $filename))->response(); });
警告
请记住, 手动提供文件会导致性能损失 ,因为您正在浏览整个Laravel请求生命周期,以便读取和发送文件内容,这比HTTP服务器处理文件慢得多。
一种select是在存储目录中的子文件夹和公共目录之间创build一个符号链接。
例如
ln -s /path/to/laravel/storage/avatars /path/to/laravel/public/avatars
这也是由Laravel的开发人员Taylor Otwellbuild立的部署经理Envoyer使用的方法。
如果你在windows上,你可以在cmd上运行这个命令:
mklink /j /path/to/laravel/public/avatars /path/to/laravel/storage/avatars
来自: http : //www.sevenforums.com/tutorials/278262-mklink-create-use-links-windows.html
根据Laravel 5.2文档,您可公开访问的文件应放在目录中
storage/app/public
为了使他们可以从networking访问,你应该创build一个从public/storage
到storage/app/public
的符号链接。
ln -s /path/to/laravel/storage/app/public /path/to/laravel/public/storage
现在,您可以使用资产助手在您的视图中创build文件的URL:
echo asset('storage/file.txt');
如果你的php只是使用php syslink函数symlink('/home/username/projectname/storage/app/public', '/home/username/public_html/storage')
将用户名和项目名称更改为正确的名称
将所有私人图像和文档保存到存储目录是一件好事,那么您将完全控制文件以太网,您可以允许特定types的用户访问文件或进行限制。
在laravel上testing5.4制作路线/文档并指向任何控制器方法
public function docs(){ // any custom logic //check if user is logged in or user have permission to download this file etc $headers = [ 'Content-Type' => 'image/png', ]; return response()->download(storage_path('app/users/documents/4YPa0bl0L01ey2jO2CTVzlfuBcrNyHE2TV8xakPk.png'), 'filename.png', $headers); }
当你打到localhost时:8000 / docs文件将被下载,如果有的话
根据上面的代码,文件必须位于root / storage / app / users / documents目录下