我需要使用filepicker.io上传到多个s3存储桶。我发现a tweet表明有一种hacky,但可能的方法来做到这一点。支持还没有回到我身边,所以我希望这里有人知道答案!
答案 0 :(得分:2)
您是否尝试过生成第二个应用程序/ API密钥?看起来他们将您的S3 / AWS凭证锁定到应用程序/ API密钥而不是直接锁定到帐户。
答案 1 :(得分:1)
支持刚回到我身边。除了创建多个应用程序之外没有办法做到这一点,如果您只是在prod / staging / dev之间切换,这是没关系的,但如果您必须上传到任意存储桶,那么这不是一个好的解决方案。
我的解决方案是在上传文件后使用x-amz-copy-source标头执行PUT请求,然后将其复制到正确的存储桶中。
这非常hacky,因为它每个文件请求两个额外的请求 - 一个filepicker.stat,另一个调用s3(或你的服务器)。
答案 2 :(得分:1)
@Ben
我正在开发代码,需要进入许多存储桶的文件相同。我在ASP.net工作。
我所做的是拥有一个带有自己的S3存储桶的Filepicker'应用程序'。
我已经在javascript onSuccess()
函数中对服务器进行了回调(它作为参数传递给filepicker.store()
)。无论如何,这个回调都需要在那里做一些簿记。
所以我刚刚在服务器端回调代码中添加了一些额外的代码,该代码使用AWS开发工具包将对象从存储桶文件选取器复制到它的最终目标存储区。
这是我的C#代码,用于在存储桶之间移动或更确切地复制对象:
public bool MoveObject(string bucket1, string key1, string bucket2, string key2 = null)
{
bool success = false;
if (key2 == null) key2 = key1;
Logger logger = new Logger(); // my logging system
try
{
RegionEndpoint region = RegionEndpoint.EUWest1; // use your region here
using (AmazonS3Client s3Client = new AmazonS3Client(region))
{
// TODO: CheckForBucketFunction
CopyObjectRequest request = new CopyObjectRequest();
request.SourceBucket = bucket1;
request.SourceKey = key1;
request.DestinationBucket = bucket2;
request.DestinationKey = key2;
S3Response response = s3Client.CopyObject(request);
logger.Info2Log("response xml = \n{0}\n", response.ResponseXml);
response.Dispose();
success = true;
}
}
catch (AmazonS3Exception ex)
{
logger.Info2Log("Error copying file between buckets: {0} - {1}",
ex.ErrorCode, ex.Message);
success = false;
}
return success;
}
有适用于其他服务器语言的AWS开发工具包,好消息是亚马逊不会在同一区域内的存储桶之间复制对象。
现在我只需要决定如何从filepicker应用程序桶中删除该对象。我可以使用更多的AWS SDK代码在服务器上执行此操作但由于它将链接保存到filepicker控制台中的对象,因此会很麻烦。或者我可以使用filepicker代码从浏览器中执行此操作。