从Laravel 9的存储门面获取S3Client

3
我正在尝试将一个S3分块上传器从Laravel 8升级到Laravel 9,并根据文档中的说明升级到Flysystem 3,没有依赖错误。但我无法访问底层的S3Client以创建分片上传。请参考https://laravel.com/docs/9.x/upgrade#flysystem-3
// Working in Laravel 8
// Laravel 9 throws exception on getAdapter()

$client = Storage::disk('s3')->getDriver()->getAdapter()->getClient();

// Underlying S3Client is used to create Multipart uploader as below
$bucket = config('filesystems.disks.s3.bucket');
$result = $client->createMultipartUpload([
    'Bucket' => $bucket,
    'Key' => $key,
    'ContentType' => 'image/jpeg',
    'ContentDisposition' => 'inline',
]);

return response()
    ->json([
        'uploadId' => $result['UploadId'],
        'key' => $result['Key'],
    ]);

然而,Laravel 9抛出了一个异常:Call to undefined method League\Flysystem\Filesystem::getAdapter()
我查看了League\Flysystem的源代码和Laravel的更新,但似乎无法找到正确的方法来处理更新并访问底层的Aws\S3\S3Client
我的大型项目正在使用一个分支的laravel-uppy-s3-multipart-upload库,可以在这里看到:https://github.com/kerkness/laravel-uppy-s3-multipart-upload/tree/laravel9
2个回答

8
这个问题在Flysystem AWS适配器的Github页面上已经讨论过:

https://github.com/thephpleague/flysystem-aws-s3-v3/issues/284

在Laravel中新增了一个方法,将于下周二(2022年2月22日)发布:

https://github.com/laravel/framework/pull/41079

解决方法

Laravel的FilesystemAdapter基类支持宏,因此您可以在AppServiceProvider中执行以下操作:

Illuminate\Filesystem\AwsS3V3Adapter::macro('getClient', fn() => $this->client);

现在你可以调用...
Storage::disk('s3')->getClient();

...然后您将拥有一个S3Client的实例。(我喜欢宏!)

在下周二的发布可用之后,您可以删除此宏。


0
如何从 Laravel 9 中的 S3 获取对象/图像?或者*** 如何在 Laravel 中显示来自 S3 的文件?***
答:只需三个步骤即可从 Laravel 9 获取任何类型的附件(例如图像、PDF、视频):
1. 进入项目目录 2. 第一步:composer require league/flysystem-aws-s3-v3 3. 第二步:进入.env 文件并添加以下内容:
AWS_ACCESS_KEY_ID=your_aws_access_key AWS_SECRET_ACCESS_KEY=your_aws_secret_key AWS_DEFAULT_REGION=your_aws_regios AWS_BUCKET=your_bucket_name AWS_USE_PATH_STYLE_ENDPOINT=false 4. 第三步:进入任何控制器,并在函数中添加以下内容:
$source = Storage::disk('s3')->temporaryUrl($item->path, now()->addMinutes(30));
5. 然后,您可以将变量 $source 传递到任何需要它的地方。
谢谢, Jahanzaib

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接