Laravel 5 - 如何访问View中存储上传的图像?

Tad*_*lek 153 laravel

我已经在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服务器处理它要慢得多.

  • 您可以将它们存储在任何您喜欢的位置,但除非这些是私有文件,否则我认为最好将它们存储在`public`目录中.通过这种方式,您将避免必须编写可由HTTP服务器更快地处理的图像响应的开销. (5认同)
  • @ user1960364这就是为什么最后一段强烈建议使用符号链接方法.但答案本身虽然不是从性能角度来看的最佳解决方案,但仍然是有效的,并且可能是人们在无法设置符号链接的共享服务器上运行应用程序的唯一方法.答案还展示了如果出现需要,可以以编程方式提供文件的方式,可能用于提供[此问题]中提到的加密文件(http://stackoverflow.com/questions/34624118/working-with-encrypted-files-in -laravel - 如何做下载解密文件/ 34624279). (3认同)
  • 我个人不会将用户文件存储在公共文件夹中,当存储文件夹用于存储时,我觉得更整洁,更易于管理. (2认同)
  • 我不建议使用其中任何一个,因为这会增加再次加载Laravel和/或利用PHP来读取每个图像的开销.使用CmdSft描述的符号链接要快得多. (2认同)

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建立的部署经理.

  • 在Laravel 5.3中有一个工匠命令:$ php artisan storage:link (6认同)
  • 问题是如何公开显示存储在"存储"中的用户头像,通常头像不需要任何类型的访问控制.如果使用任何类型的中间件或路由都不需要安全性,那么只会浪费您的资源.值得一提的是,Laravel 5.2使用符号链接存在公共文件(https://laravel.com/docs/5.2/filesystem)的单独文件"磁盘". (3认同)

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)


Ara*_*our 7

如果你想加载少量的私有图像,你可以将图像编码为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()有两个重要的缺点:

  1. 这将使图像大小增加约 30%。
  2. 您将所有图像大小合并在一个请求中,而不是并行加载它们,这对于某些小缩略图来说应该不是问题,但对于许多图像来说,请避免使用此方法。


Sye*_*bli 5

最好将所有私有图像和文档保存在存储目录中,这样您就可以完全控制文件以太,您可以允许某些类型的用户访问该文件或限制。

创建一个路由/文档并指向任何控制器方法:

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.


Dny*_*rer 5

如果磁盘“本地”不适合您,请尝试以下操作:

  1. 将本地更改为公共'default' => env('FILESYSTEM_DRIVER', 'public'),从project_folder/config/filesystem.php
  2. 清除配置缓存php artisan config:clear
  3. 然后创建符号链接php artisan storage:link

要获取上传图像的 url,您可以使用此Storage::url('image_name.jpg');