提问者:小点点

Laravel 5-如何在视图中访问上传到存储器中的图像?


我已经将用户的头像上传到了Laravel存储中。如何访问它们并在视图中渲染它们?

服务器将所有请求指向/Public,所以如果它们在/store文件夹中,我如何显示它们?


共3个答案

匿名用户

最好的方法是创建一个符号链接,如下面的答案中所指出的@SlateEntropy。为了帮助实现这一点,自5.3版以来,Laravel包含了一个命令,该命令使这项工作非常容易:

php artisan storage:link

这为您创建了一个从public/storagestorage/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

如果您使用的是干预图像库,您可以使用其内置的响应方法使内容更加简洁:

Route::get('storage/{filename}', function ($filename)
{
    return Image::make(storage_path('public/' . $filename))->response();
});

警告

请记住,通过手动提供文件,您会受到性能损失,因为为了读取和发送文件内容,您将经历整个Laravel请求生命周期,这比让HTTP服务器处理它要慢得多。

匿名用户

一个选项是在存储目录和公共目录中的子文件夹之间创建符号链接。

例如

ln -s /path/to/laravel/storage/avatars /path/to/laravel/public/avatars

这也是Envoyer使用的方法,Envoyer是Laravel的开发者Taylor Otwell构建的部署管理器。

匿名用户

根据Laravel 5.2文档,您可以公开访问的文件应该放在目录中

storage/app/public

要从web访问它们,您应该创建一个从public/storagestorage/app/public的符号链接。

ln -s /path/to/laravel/storage/app/public /path/to/laravel/public/storage

现在,您可以使用资产帮助器在视图中创建指向文件的URL:

echo asset('storage/file.txt');