Amazon S3在PUT上出现501错误

时间:2011-10-06 03:49:30

标签: iphone ios amazon-s3

在测试一个新的应用程序时,一个测试人员总是将他上传到S3失败。我们向S3发送一个~1.2mb文件的PUT请求并设置它的ACL权限。对他来说,他总是得到501 - Not Implemented错误。

以下是请求中的标题:

"Accept-Encoding" = gzip; 
Authorization = "AWS ###:###";
"Content-Encoding" = gzip;
"Content-Length" = 1420267;
"Content-Type" = "application/octet-stream";
Date = "Thu, 6 Oct 2011 02:59:47 +0000";
"User-Agent" = "MyApp 1.0 (iPhone; iPhone OS 4.3.1; en_US)";
"x-amz-acl" = "public-read-write";

以下是回复标题:

Connection = close;
"Content-Length" = 321;
"Content-Type" = "application/xml";
Date = "Thu, 06 Oct 2011 03:00:14 GMT";
Server = AmazonS3;

欢迎任何想法!

响应返回状态码501和字符串 - “您提供的标头意味着没有的功能 实施了“

6 个答案:

答案 0 :(得分:5)

响应正文包含XML,列出了它不满意的标题,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<Error>
<Code>NotImplemented</Code>
<Message>A header you provided implies functionality that is not implemented</Message>
<Header>If-Modified-Since</Header>
</Error>

我将NSURLRequest上的缓存策略设置为NSURLRequestReloadIgnoringCacheData,并且它停止添加不需要的If-Modified-Since标头:

    mutableURLRequest = [[NSMutableURLRequest alloc] initWithURL:theURL];
    [mutableURLRequest setCachePolicy:NSURLRequestReloadIgnoringCacheData];

答案 1 :(得分:3)

如果没有提供Content-Length,则可以发送来自亚马逊的501响应代码。

由于您这样做,我建议您通过代理(Mac的Charles或Windows的Fiddler)运行请求,并确保发送的请求实际包含内容 - 长度标题

答案 2 :(得分:3)

关于这个主题的一些更新,因为我自己在寻找答案。这似乎是一个相当普遍的错误信息,有多种可能的原因。

对于javascript api,2012年12月24日有一个关于空体的错误修复:

最近在IOS 8上,主动(和非标准)缓存存在问题,亚马逊不喜欢这种问题。如果以前有任何GetObject,则为同一对象/ url的后续请求发送If-Modified-Since标头,即使对于PUT请求也是如此:

答案 3 :(得分:0)

我使用CPAN的Net :: Amazon :: S3 :: Client在Perl中遇到了这个问题。我检查了请求和响应,并将问题拼凑在一起,这是因为我缺乏通过HTTPS请求的能力。我通过安装LWP :: Protocol :: https来修复它。

答案 4 :(得分:0)

我也遇到了这个问题,在node js代码中实现putObject的时候,发现没有对JSON体进行stringfy,导致同样的错误。

答案 5 :(得分:0)

正如@Alon Burg 指出的那样,S3 期望设置 Content-Length 标头。您不能直接使用流(或者我不知道如何使用); Fetch(或 node-fetch)在传入 ReadStream 作为主体时,它将 transport-encoding 标头设置为 S3 不支持的 chunked(当使用 {{1 }}).

解决方法是首先将 putObject 转换为 ReadStream(或字符串)并将其作为允许 Buffer 计算门后的 fetch 的主体传递