gpt4 book ai didi

Laravel s3 存储 : undefined method 'url'

转载 作者:行者123 更新时间:2023-12-03 23:09:21 25 4
gpt4 key购买 nike

我是使用 amazon s3 和 laravel 的初学者,我无法调用 url() 方法从 s3 文件中检索完整的 url。

我在 Laravel 版本 5.8.29
并为 s3 安装了适当的 Composer 包

在将文件上传到存储桶后,我正在测试检索 url。上传成功。

use Illuminate\Support\Facades\Storage;

$url = Storage::url('file.jpg');

$url = Storage::disk('s3')->url('image.png');

使用 Storage::url('file.jpg') 可以,但是

使用 Storage::disk('s3')->url('image.png') 我会收到一条错误消息“未定义的方法'url'”,即使它在 laravel 官方文档中,我也不知道为什么。

最佳答案

我也对这个“错误”感到厌烦。 VSCode 和 Intelephene 一直在说 Undefined method 'url'对于任何 Storage::disk('s3')->url('path.ext'); ,即使知道这是 Laravel docs File Storage 上建议的方法.对于特定于 5.8 的文档,look here .

显然,处理这个问题的方法不止一种,我不确定在不改变 Laravel 本身的情况下选择哪种方法是正确的。我会告诉你我认为最好的方法,至少对我来说是这样,因为我正在尝试解决同样的问题。

外面建议的一些方法是:

  • 使用默认的云文件系统 like this :

    Storage::cloud()->url('filename.ext');

    但我承认我不喜欢它,因为我更喜欢指定磁盘名称。请记住,要使用它,您将定义 cloud配置在 config/filesystems.php ,像这样:'cloud' => env('FILESYSTEM_CLOUD', 's3') .但是如果有什么我们可以通过 cloud 学习的东西方法,是它在读取代码时向 IDE 返回正确的类型(我们将使用它)。
  • 根据 cloud上面的方法,它返回 \Illuminate\Filesystem\FilesystemManager .因此,我们可以使用它在变量注释中指定它,如下所示:

    /** @var \Illuminate\Filesystem\FilesystemManager $disk */
    $disk = Storage::disk('s3');
    $url = $disk->url('filename.ext');

    Greg提到here .我真的很喜欢这个实现,我可能会使用它。请记住,您还可以始终创建一个方法以在任何地方返回该方法以避免重复代码:

    /**
    * Return the s3 storage disk.
    *
    * @return \Illuminate\Filesystem\FilesystemAdapter
    */
    private function getDisk()
    {
    return Storage::disk('s3');
    }
  • 另一种稳健的方法是直接使用 Laravel 在表格下使用的一些更隐藏的方法来生成 url:

    $s3 = Storage::disk('s3')->getAdapter()->getClient();
    $url = $s3->getObjectUrl(env('AWS_BUCKET'), 'filename.ext');

    即使无需设置文件系统 url,这也可能会生成 url在配置中,但正如人们评论的那样,它可能不适用于非公共(public) s3 目录。据我测试,如果你有 url在配置中设置它只会不考虑它。就个人而言,在所有这些原因之后,我不喜欢这个。
  • 还有另一种方式,比如扩展外观,但我也不喜欢,我宁愿不在这里发布它,首先是因为它的代码太多,不适合琐碎的事情,其次是不推荐它。但是,当然,如果您想以集中的方式处理这个问题,那可能是路径。

  • 如您所见,现在更快更干净的方法是 使用 @var符号 .

    希望有人在不久的将来解决这个问题,或者出现另一种更好的方法。如果有人知道更好的东西,请在评论中告诉我,我很乐意在这里更新。

    相关资料:
  • Laravel league/flysystem getting file URL with AWS S3
  • storage url from s3
  • Getting started with Amazon S3 storage in Laravel

  • 如果这有帮助,请记住考虑接受答案或点赞。

    关于Laravel s3 存储 : undefined method 'url' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59677786/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com