我试图在Unity内部的S3存储桶之间传输文件,遇到了我找不到文档的神秘错误。两个存储桶属于同一个帐户。
每当我创建资产时,我都会将其上传到Dev Bucket中的S3服务器,这非常有效。当我准备提交资产时,我想浏览Prod Bucket中缺失的资产列表,并将它们从Dev Bucket转移过来。根据我的研究,IAmazon onS3。CopyObjectAsync()
是应该执行此任务的函数。IAmazon onS3。CopyObject()
函数在Amazon的Unity SDK中不可用。
下面是我在尝试复制对象时调用的代码:
public void TestCopy()
{
var request = new CopyObjectRequest()
{
SourceBucket = mLoginData.DevBucket,
SourceKey = "myPic.jpg",
DestinationBucket = mLoginData.ProdBucket,
DestinationKey = "myPic.jpg"
};
AWSConfigs.HttpClient = AWSConfigs.HttpClientOption.UnityWebRequest;
Client.CopyObjectAsync(request,(responseObj) =>
{
if (responseObj.Exception == null)
{
ResultText.text += "Copied Object";
}
else
{
ResultText.text += "Got Exception: \n" + responseObj.Exception.ToString();
}
});
}
这会导致Amazon错误代码留档中未提及的“已移动”错误代码:
Got Exception:
Amazon.S3.AmazonS3Exception: Error making request with Error Code Moved and Http Status Code Moved. No further error information was returned by the service. Response Body: Encountered invalid redirect (missing Location header?) ---> Amazon.Runtime.Internal.HttpErrorResponseException: Exception of type 'Amazon.Runtime.Internal.HttpErrorResponseException' was thrown.
at Amazon.Runtime.Internal.UnityRequest.EndGetResponse (IAsyncResult asyncResult) [0x00000] in <filename unknown>:0
at Amazon.Runtime.Internal.HttpHandler`1[System.String].GetResponseCallbackHelper (System.Object state) [0x00000] in <filename unknown>:0
--- End of inner exception stack trace ---
at Amazon.Runtime.Internal.HttpErrorResponseExceptionHandler.HandleException (IExecutionContext executionContext, Amazon.Runtime.Internal.HttpErrorResponseException exception) [0x00000] in <filename unknown>:0
at Amazon.Runtime.Internal.ExceptionHandler`1[T].Handle (IExecutionContext executionContext, System.Exception exception) [0x00000] in <filename unknown>:0
at Amazon.Runtime.Internal.ErrorHandler.ProcessException (IExecutionContext executionContext, System.Exception exception) [0x00000] in <filename unknown>:0
at Amazon.Runtime.Internal.ErrorHandler.InvokeAsyncCallback (IAsyncExecutionContext executionContext) [0x00000] in <filename unknown>:0
我知道我的设置正确,因为我能够查看/列出存储桶,将文件上传/列出/删除到两个存储桶等。从 Unity 编辑器执行解决方案至关重要。
基于直接使用S3 API的丰富经验,我有理由相信这是您的错误:
永久重定向
您试图访问的存储桶必须使用指定的endpoint进行寻址。将所有未来请求发送到此终结点。
< code>301永久移动
我相信底层库对您隐藏了这一点,而Moved
错误是该库对301错误的解释。为什么这样做毫无意义,但这也是为什么我更喜欢直接使用S3RESTAPI的原因。
Encountered invalid redirect (missing Location header?)
这与记录的行为一致。
为了帮助您在开发过程中找到这些错误,这种类型的重定向不包含Location HTTP头,它允许您自动跟踪请求到达正确的位置。参考产生的XML错误文档,以获得使用正确的亚马逊S3endpoint的帮助。
http://docs.aws.amazon.com/AmazonS3/latest/dev/Redirects.html
如果有一种方法可以让您掌握该 XML 响应正文,它可能会有所帮助。
如果您使用全局(非区域特定)终端节点访问存储桶,并且存储桶位于 us-east-1 以外的区域,则此错误在存储桶创建的最初几分钟内很常见,这就是我询问存储桶是否是新存储桶的原因。
如果buckets不在us-east-1中,您可能需要在代码中的某个地方传递一个区域,因为上面的错误表明您的请求到达了错误的区域endpoint。
事实证明,CopyObjectAsync需要使用IAmazonS3客户端的一个实例,该实例配置了目标区域,而不是源区域。更改此选项后,复制效果良好。