我的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');

Where /bucket-name/ could be any bucket that I already create. What can I do? Thanks a lot!

推荐答案

您说得对,Config::set();对于每个请求只能工作一次.我的估计是,这是故意这样做的,目的是阻止您在代码示例中try 执行的那种操作.

In config/filesystems.php you can list any number of "disks". These are locations of your file repositories. It looks like so:

'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',''),
    ],
]

The Solution

解决方案是创建一个包含您想要使用的额外存储桶的新磁盘.Treat your buckets like different disks.

Note: The user that the S3_Key belongs to needs to have permissions to perform your required actions on the S3 buckets you are setting up as additional 'disks'.

'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',
    ],
]

然后,无论何时,只要你想进入你 Select 的桶,就这样称呼它:

Storage::disk('s3')->put($fileName, $data);
Storage::disk('s3MyOtherBucketName')->put($anotherFileName, $moreData);
Storage::disk('s3YetAnotherBucketName')->put($yetAnotherFileName, $evenMoreData);

Laravel相关问答推荐

当使用Craftable PRO时,Wysiwig是什么时候生成的?

如何在控制器中获取所需参数?

Laravel本地化错误:"setlocale():参数#1($category)的类型必须是int,给定的是Illuminate\Http\Request"

如何在Laravel中创建自定义单项集合

如何在Vite和Rollup中完全禁用分块?

Laravel REST API:如何将数据库列名与参数的另一个名称映射?

我在 laravel 中插入多个复选框值.我怎样才能做到这一点?

API GET 请求得到与数据库记录不同的结果

Laravel | 使用select查询

处理程序类中的错误 - Laravel

Laravel created_at 返回对象代替数据库中的日期格式?

Laravel & Docker:无法打开流或文件/var/www/html/storage/logs/laravel.log:无法打开流:权限被拒绝

Laravel 5 Eloquent 范围连接并 Select 特定列

Laravel:如何通过 id 从集合中删除项目

如何判断是否在laravel中设置了cookie?

如何在 Laravel 查询中使用多个 OR、AND 条件

如果 Laravel 中的值不为空,如何验证输入字段

如何在 Laravel 中使用补丁请求?

在 Laravel 中结合 AND/OR Eloquent的查询

如果在 Laravel 5.1 中找不到路由,则显示 404 页面