Laravel s3多铲斗

7xllpg7q  于 2022-12-14  发布在  其他
关注(0)|答案(4)|浏览(165)

我的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/可以是我已经创建的任何bucket。我能做些什么呢?非常感谢!

xn1cxnb4

xn1cxnb41#

您是正确的,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);
raogr8fs

raogr8fs2#

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

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

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

vxf3dgd43#

您可以将存储桶添加到文件系统配置中,如下所示:

'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);
vdzxcuhz

vdzxcuhz4#

我为自己创建了一个类,并将其命名为StorageProxy。您可以使用find it here
假设您想要使用多个驱动程序,其中一个是S3兼容对象存储,但您可能需要动态更改存储驱动程序,例如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
],

由于它是一个代理类,所有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

相关问题