我的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。我能做些什么呢?非常感谢!
4条答案
按热度按时间xn1cxnb41#
您是正确的,
Config::set();
在每个请求中只工作一次。我估计这样做是有意的,以阻止您在代码示例中尝试做的事情。在config/filesystems.php中,你可以列出任意数量的“磁盘”,它们是你的文件存储库的位置,看起来像这样:
解决方案
解决方法是为您要使用的额外存储桶创建一个新磁盘。将您的存储桶视为不同的磁盘。
**注意:**S3_Key所属的用户需要具有对设置为附加“磁盘”的S3存储桶执行所需操作的权限。
然后,无论何时,只要你想访问你选择的桶,就可以这样调用它:
raogr8fs2#
如果您有动态存储桶,则还可以创建一个新示例,如下所示:
vxf3dgd43#
您可以将存储桶添加到文件系统配置中,如下所示:
然后,您可以使用以下命令访问服务器:
vdzxcuhz4#
我为自己创建了一个类,并将其命名为
StorageProxy
。您可以使用find it here。假设您想要使用多个驱动程序,其中一个是S3兼容对象存储,但您可能需要动态更改存储驱动程序,例如
local
。没有问题,StorageProxy
可以处理它!(类似于mc
- MinIO客户端)用法:
如果未指定磁盘,则使用
default
磁盘(在filesystem.php
中定义)。示例:
对于
local
驱动程序,我们的文件位于images/sample.jpg
中对于
s3
驱动程序,我们的文件位于images
存储桶中,名称为sample.jpg
我们的
filesystem.php
文件应该如下所示:由于它是一个代理类,所有
Storage
方法在 StorageProxy 中也可用。此外,您不需要从s3
磁盘的文件路径中删除存储桶名称。