[英]Laravel s3 multiple buckets
我的 Laravel 应用程序需要将存在于多个存储桶中的文件同时处理到一个 session 中。因此,我找不到将当前存储桶更改多次的方法,因为我的.env
文件是这样的:
S3_KEY='MY-KEY'
S3_SECRET='MySeCret'
S3_REGION='us-east-1'
S3_BUCKET='my-first-used-bucket'
我找到了可以做到这一点的地方:
Config::set('filesystems.disks.s3.bucket', 'another-bucket');
但它只工作一次。 我需要的是这样的:
Storage::disk('s3')->put('/bucket-name/path/filename.jpg', $file, 'public');
/bucket-name/
可以是我已经创建的任何存储桶。 我能做什么? 非常感谢!
你是正确的Config::set();
每个请求只能工作一次。 我的估计是故意这样做是为了阻止您在代码示例中尝试做的事情。
在 config/filesystems.php 中,您可以列出任意数量的“磁盘”。 这些是文件存储库的位置。 它看起来像这样:
'disks' => [
'local' => [
'driver' => 'local',
'root' => storage_path('app'),
],
'ftp' => [
'driver' => 'ftp',
'host' => 'ftp.example.com',
'username' => 'your-username',
'password' => 'your-password',
// Optional FTP Settings...
// 'port' => 21,
// 'root' => '',
// 'passive' => true,
// 'ssl' => true,
// 'timeout' => 30,
],
's3' => [
'driver' => 's3',
'key' => env('S3_KEY',''),
'secret' => env('S3_SECRET',''),
'region' => env('S3_REGION',''),
'bucket' => env('S3_BUCKET',''),
],
]
解决方案是为要使用的额外存储桶创建一个新磁盘。 将您的存储桶视为不同的磁盘。
注意: S3_Key 所属的用户需要具有在您设置为附加“磁盘”的 S3 存储桶上执行所需操作的权限。
'disks' => [
//All your other 'disks'
...
//My default bucket details.
's3' => [
'driver' => 's3',
'key' => env('S3_KEY',''),
'secret' => env('S3_SECRET',''),
'region' => env('S3_REGION',''),
'bucket' => env('S3_BUCKET',''),
],
's3MyOtherBucketName' => [
'driver' => 's3',
'key' => env('S3_KEY',''),
'secret' => env('S3_SECRET',''),
'region' => env('S3_REGION',''),
'bucket' => 'myOtherBucketName',
],
's3YetAnotherBucketName' => [
'driver' => 's3',
'key' => env('S3_KEY',''),
'secret' => env('S3_SECRET',''),
'region' => env('S3_REGION',''),
'bucket' => 'yetAnotherBucketName',
],
]
然后,每当您想访问您选择的存储桶时,请像这样调用它:
Storage::disk('s3')->put($fileName, $data);
Storage::disk('s3MyOtherBucketName')->put($anotherFileName, $moreData);
Storage::disk('s3YetAnotherBucketName')->put($yetAnotherFileName, $evenMoreData);
如果您有动态存储桶,您还可以像这样创建一个新实例:
$storage = Storage::createS3Driver([
'driver' => 's3',
'key' => 'your-key',
'secret' => 'your-secret',
'region' => 'us-east-1',
'bucket' => $bucketName,
]);
$storage->put('path/to/file.png', $content);
您可以将存储桶添加到文件系统配置中,如下所示:
'disks' => [
's3' => [
'bucket1' => [
'driver' => 's3',
'key' => env('AWS_BUCKET1_ACCESS_KEY_ID'),
'secret' => env('AWS_BUCKET1_SECRET_ACCESS_KEY'),
'region' => env('AWS_BUCKET1_DEFAULT_REGION'),
'bucket' => env('AWS_BUCKET1_BUCKET'),
'url' => env('AWS_BUCKET1_URL'),
],
'bucket2' => [
'driver' => 's3',
'key' => env('AWS_BUCKET2_ACCESS_KEY_ID'),
'secret' => env('AWS_BUCKET2_SECRET_ACCESS_KEY'),
'region' => env('AWS_BUCKET2_DEFAULT_REGION'),
'bucket' => env('AWS_BUCKET2_BUCKET'),
'url' => env('AWS_BUCKET2_URL'),
],
],
],
然后您可以使用以下命令访问服务器:
\Storage::disk('s3.bucket1')->put('path/to/file.png', $content);
我为自己创建了一个 class 并将其命名为StorageProxy
。 你可以在这里找到它。
假设您想要使用多个驱动程序,其中一个是 S3 兼容的 Object 存储,但您可能需要即时更改存储驱动程序,例如local
。 没问题, StorageProxy
会处理它! (类似于mc
- MinIO 客户端)
用法:
StorageProxy::touch(?string $disk, ?string $bucket)->{everyStorageMethod}();
如果未指定磁盘,则使用default
磁盘(在filesystem.php
中定义)。
示例:
对于local
驱动程序,我们的文件存在于images/sample.jpg
中
对于s3
驱动程序,我们的文件存在于images
桶中,名称为sample.jpg
我们的filesystem.php
文件应该如下所示:
'localhost' => [
'driver' => 'local',
'root' => storage_path('/'),
],
'DO' => [
'driver' => 's3',
'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('AWS_SECRET_ACCESS_KEY'),
'region' => env('AWS_DEFAULT_REGION'),
// No need to specify the `bucket` property here
],
由于它是代理 class,因此所有Storage
方法在StorageProxy中也可用。 此外,您不需要从s3
磁盘的文件路径中删除存储桶名称。
// For local disk
$disk = 'localhost';
StorageProxy::touch($disk)->exists("images/sample.jpg"); // true
// For S3 disk
$disk = 'DO';
StorageProxy::touch($disk)->exists("images/sample.jpg"); // true
StorageProxy::touch($disk, "images")->exists("images/sample.jpg"); // true
StorageProxy::touch($disk, "images")->bucketDetection(false)->exists("images/sample.jpg"); // false - the file path is considered as images/images/sample.jpg
StorageProxy::touch($disk, "images")->exists("sample.jpg"); // true
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.