从 Laravel 9 中的存储门面获取 S3Client
Get S3Client from storage facade in 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'],
]);
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
这已在 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
基础 class 是可宏化的,这意味着您可以在 AppServiceProvider
:
中执行此操作
Illuminate\Filesystem\AwsS3V3Adapter::macro('getClient', fn() => $this->client);
现在您可以调用...
Storage::disk('s3')->getClient();
...您将拥有 S3Client
的一个实例。 (我喜欢宏!)
您可以在下周二发布后删除此宏。
我正在尝试将 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'],
]);
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
这已在 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
基础 class 是可宏化的,这意味着您可以在 AppServiceProvider
:
Illuminate\Filesystem\AwsS3V3Adapter::macro('getClient', fn() => $this->client);
现在您可以调用...
Storage::disk('s3')->getClient();
...您将拥有 S3Client
的一个实例。 (我喜欢宏!)
您可以在下周二发布后删除此宏。