从 Laravel 9 中的存储外观获取 S3Client

Ker*_*ess 3 php amazon-s3 laravel laravel-9

我正在尝试将 S3 Multipart Uploader 从 Laravel 8 升级到 Laravel 9,并已按照文档中的概述升级到 Flysystem 3,并且没有依赖项错误https://laravel.com/docs/9.x/upgrade#flysystem-3

我无法访问底层 S3Client 以创建分段上传。

// 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'],
    ]);
Run Code Online (Sandbox Code Playgroud)

然而,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

jsz*_*ody 9

这在 Flysystem AWS 适配器 github 问题中进行了讨论:

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

Laravel 中正在添加一个方法,并将于下周二(2022 年 2 月 22 日)发布:

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

解决方法

LaravelFilesystemAdapter基类是可宏化的,这意味着您可以在您的AppServiceProvider

Illuminate\Filesystem\AwsS3V3Adapter::macro('getClient', fn() => $this->client);
Run Code Online (Sandbox Code Playgroud)

现在你可以打电话...

Storage::disk('s3')->getClient();
Run Code Online (Sandbox Code Playgroud)

...您将拥有一个S3Client. (我喜欢宏!)

下周二的版本发布后,您可以删除此宏。