小编典典

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

all

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

服务器将所有请求指向/public,那么如果它们在文件夹中,我该如何显示它们/storage


阅读 91

收藏
2022-06-29

共1个答案

小编典典

最好 的方法是创建一个像@SlateEntropy 这样的 符号链接,在下面的答案中很好地指出了这一点。为了帮助解决这个问题,从 5.3
版本开始,Laravel包含一个命令,这使得这非常容易做到:

php artisan storage:link

这将为您创建一个从public/storageto的符号链接,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

如果您使用的是干预图像库,则可以使用其内置response方法使事情更简洁:

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

警告

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

2022-06-29