在测试一个新的应用程序时,一个测试人员总是将他上传到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和字符串 - “您提供的标头意味着没有的功能 实施了“
答案 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)
由于您这样做,我建议您通过代理(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
的主体传递