拉拉维尔 s3 多桶

我的 Laravel 应用程序需要将多个存储桶中的文件同时操作到单个会话中。因此,我找不到将当前存储桶更改多次的方法,因为我的文件如下所示:.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/


答案 1

你是对的,因为每个请求只工作一次。我的估计是,这样做是为了阻止您在代码示例中尝试做的事情。Config::set();

在配置/文件系统中.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);

答案 2

如果您有动态存储桶,您还可以创建一个新实例,如下所示:

$storage = Storage::createS3Driver([
    'driver' => 's3',
    'key'    => 'your-key',
    'secret' => 'your-secret',
    'region' => 'us-east-1',
    'bucket' => $bucketName,
]);

$storage->put('path/to/file.png', $content);

推荐