Php Laravel s3多个铲斗
我的Laravel应用程序需要在单个会话中同时处理多个存储桶中的文件。因此,我无法找到一种方法来多次更改当前存储桶,因为我的Php Laravel s3多个铲斗,php,laravel,amazon-web-services,amazon-s3,Php,Laravel,Amazon Web Services,Amazon S3,我的Laravel应用程序需要在单个会话中同时处理多个存储桶中的文件。因此,我无法找到一种方法来多次更改当前存储桶,因为我的.env文件如下所示: S3_KEY='MY-KEY' S3_SECRET='MySeCret' S3_REGION='us-east-1' S3_BUCKET='my-first-used-bucket' $storage = Storage::createS3Driver([ 'driver' => 's3', 'key' => 'y
.env
文件如下所示:
S3_KEY='MY-KEY'
S3_SECRET='MySeCret'
S3_REGION='us-east-1'
S3_BUCKET='my-first-used-bucket'
$storage = Storage::createS3Driver([
'driver' => 's3',
'key' => 'your-key',
'secret' => 'your-secret',
'region' => 'us-east-1',
'bucket' => $bucketName,
]);
$storage->put('path/to/file.png', $content);
我找到了一个可以做到这一点的地方:
Config::set('filesystems.disks.s3.bucket', 'another-bucket');
但它只起作用一次。我需要的是:
Storage::disk('s3')->put('/bucket-name/path/filename.jpg', $file, 'public');
其中
/bucket name/
可以是我已经创建的任何bucket。我能做什么?非常感谢 您的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\u密钥所属的用户需要有权限在您设置为附加“磁盘”的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);
如果您有动态bucket,还可以创建如下新实例:
S3_KEY='MY-KEY'
S3_SECRET='MySeCret'
S3_REGION='us-east-1'
S3_BUCKET='my-first-used-bucket'
$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);
什么意思,只工作一次<代码>配置::设置('foo','bar');配置::set('foo','baz');echo配置::get('foo');//baz
会工作的…@BenSwinburne它的工作原理就像第一个配置。因此,如果我使用Config::set设置一个bucket,它会工作,文件将存储到正确的位置,但是如果我稍后尝试使用相同的方法更改bucket,当前bucket将保持不变,文件将存储到第一个bucket中。这是处理多个s3 bucket的最优雅的方式。谢谢如果bucket是唯一不同的,但所有bucket都具有相同的密钥、机密和区域,该怎么办?这不是一个冗余代码吗?有很多很好的理由可以使用冗余代码,特别是当重复的代码行彼此靠近时,这样其他开发人员就可以注意到重复。这样的冗余量不应该引起任何警报,所以您可以使用它作为不同“客户”或“客户”的分隔符吗?是不存储副本,还是存储副本?如何对照现有的s3“bucket”进行检查?