我已经在Laravel存储中上传了用户的头像.如何访问它们并在视图中呈现它们?
服务器指向所有请求/public,因此如果它们在/storage文件夹中,我该如何显示它们?
Bog*_*dan 307
在最好的方法是创建一个符号链接像@SlateEntropy相当不错,指出了下面的答案.为了解决这个问题,从版本5.3开始,Laravel 包含一个命令,使得这非常容易:
php artisan storage:link
Run Code Online (Sandbox Code Playgroud)
从创建一个符号链接public/storage到storage/app/public你,这一切就是这么简单.现在任何文件/storage/app/public都可以通过以下链接访问:
http://somedomain.com/storage/image.jpg
Run Code Online (Sandbox Code Playgroud)
如果出于任何原因,您无法创建符号链接(也许您正在共享托管等)或者您想要保护某些访问控制逻辑背后的某些文件,那么可以选择使用特殊的路径来读取和为图像服务.例如一个简单的闭包路线,如下所示:
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;
});
Run Code Online (Sandbox Code Playgroud)
您现在可以像访问符号链接一样访问文件:
http://somedomain.com/storage/image.jpg
Run Code Online (Sandbox Code Playgroud)
如果您正在使用干预图像库,您可以使用其内置response方法使事情更简洁:
Route::get('storage/{filename}', function ($filename)
{
return Image::make(storage_path('public/' . $filename))->response();
});
Run Code Online (Sandbox Code Playgroud)
警告
请记住,通过手动提供文件会导致性能下降,因为您要经历整个Laravel请求生命周期以便读取和发送文件内容,这比HTTP服务器处理它要慢得多.
Sla*_*opy 50
一种选择是在存储目录中的子文件夹和公共目录之间创建符号链接.
例如
ln -s /path/to/laravel/storage/avatars /path/to/laravel/public/avatars
Run Code Online (Sandbox Code Playgroud)
这也是Envoyer使用的方法,Envoyer是Laravel开发人员Taylor Otwell建立的部署经理.
Pio*_*otr 18
根据Laravel 5.2文档,您的可公开访问的文件应放在目录中
storage/app/public
Run Code Online (Sandbox Code Playgroud)
为了让他们从网络访问,您应该创建符号链接public/storage到storage/app/public.
ln -s /path/to/laravel/storage/app/public /path/to/laravel/public/storage
Run Code Online (Sandbox Code Playgroud)
现在,您可以使用资产助手在视图中创建文件的URL:
echo asset('storage/file.txt');
Run Code Online (Sandbox Code Playgroud)
cab*_*abs 15
如果您在Windows上,则可以在cmd上运行此命令:
mklink /j /path/to/laravel/public/avatars /path/to/laravel/storage/avatars
Run Code Online (Sandbox Code Playgroud)
来自:http: //www.sevenforums.com/tutorials/278262-mklink-create-use-links-windows.html
Hai*_*Ali 10
首先,您需要使用artisan命令为存储目录创建符号链接
php artisan storage:link
Run Code Online (Sandbox Code Playgroud)
然后在任何视图中,您都可以通过url helper访问您的图像.
url('storage/avatars/image.png');
Run Code Online (Sandbox Code Playgroud)
如果你想加载少量的私有图像,你可以将图像编码为base64并<img src="{{$image_data}}">直接将它们回显:
$path = image.png
$full_path = Storage::path($path);
$base64 = base64_encode(Storage::get($path));
$image_data = 'data:'.mime_content_type($full_path) . ';base64,' . $base64;
Run Code Online (Sandbox Code Playgroud)
我提到私有是因为如果您不想存储可通过 url 公开访问的图像,则只应使用这些方法,而必须始终使用标准方法(链接存储/公共文件夹并使用 HTTP 服务器提供图像)。
请注意编码base64()有两个重要的缺点:
最好将所有私有图像和文档保存在存储目录中,这样您就可以完全控制文件以太,您可以允许某些类型的用户访问该文件或限制。
创建一个路由/文档并指向任何控制器方法:
public function docs() {
//custom logic
//check if user is logged in or user have permission to download this file etc
return response()->download(
storage_path('app/users/documents/4YPa0bl0L01ey2jO2CTVzlfuBcrNyHE2TV8xakPk.png'),
'filename.png',
['Content-Type' => 'image/png']
);
}
Run Code Online (Sandbox Code Playgroud)
当您点击localhost:8000/docs文件时,如果存在,则会下载文件。
该文件必须位于root/storage/app/users/documents根据上面代码的目录中,这是在Laravel 5.4.
如果磁盘“本地”不适合您,请尝试以下操作:
'default' => env('FILESYSTEM_DRIVER', 'public'),从project_folder/config/filesystem.phpphp artisan config:clearphp artisan storage:link要获取上传图像的 url,您可以使用此Storage::url('image_name.jpg');