我需要使用 filepicker.io 上传到多个 s3 存储桶。我发现一条推文表明有一种 hacky 但可能的方法来做到这一点。支持还没有回复我,所以我希望这里的人已经知道答案了!
3 回答
您是否尝试过生成第二个应用程序/API 密钥?看起来他们将您的 S3/AWS 凭证锁定到应用程序/API 密钥,而不是直接锁定到帐户。
@本
我正在开发具有相同问题的代码,需要进入许多存储桶。我在 ASP.net 中工作。
我所做的是拥有一个带有自己的 S3 存储桶的 Filepicker“应用程序”。我已经在 javascriptonSuccess()
函数中对服务器进行了回调(作为参数传递给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 开发工具包,好消息是亚马逊不对在同一区域的存储桶之间复制对象收费。
现在我只需要决定如何从文件选择器应用程序桶中删除对象。我可以使用更多 AWS SDK 代码在服务器上执行此操作,但这会很混乱,因为它会在文件选择器控制台中留下指向对象的链接。或者我可以使用文件选择器代码从浏览器中执行此操作。
支持刚刚回复我。除了创建多个应用程序之外,没有其他方法可以做到这一点,如果您只是在 prod/staging/dev 之间切换,这没关系,但如果您必须上传到任意存储桶,则不是一个好的解决方案。
我的解决方案是在文件上传后使用 x-amz-copy-source 标头执行 PUT 请求,将其复制到正确的存储桶中。
这很 hacky,因为它为每个文件请求两个额外的请求——一个 filepicker.stat 和一个对 s3(或您的服务器)的调用。