Laravel s3 存储 : undefined method 'url'

标签 laravel amazon-s3 storage

我是使用 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/

    相关文章:

    python - 在 Lambda 中读取 AWS S3 CSV 列名

    amazon-web-services - 如何使用版本控制获取 S3 存储桶中所有文件的大小?

    cocoa - Core Data存储数据文件占用过多空间

    php - 检查哪个 `guard` 已登录

    php - 如何在laravel中创建资源路由

    laravel - 在 Laravel 中使用 Eloquent 查询连接表

    Java-数据存储和自动运行程序?

    php - 事务在 laravel 中不起作用

    ruby-on-rails - Carrierwave 在生产端通过 "heroku rails console"从 s3 添加图片

    c++ - 函数返回空指针而不是地址