在测试新应用程序时,一位测试人员总是上传到 S3 失败。我们正在向 S3 发送约 1.2mb 文件的 PUT 请求并设置其 ACL 权限。对于他来说,他总是收到 501 - 未实现错误。
以下是他的请求标头:
"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 和字符串 - “您提供的标头暗示了不属于的功能 已实施”
响应正文包含 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];
as @Alon Burg 指出,S3 期望设置
Content-Length
标头。你不能直接使用流(或者我不知道如何); Fetch
(或节点获取)当传入 ReadStream
作为主体时,它将 transport-encoding
标头设置为 S3 不支持的 chunked
(当使用 putObject
时)。
解决方法是首先将
ReadStream
转换为 Buffer
(或字符串)并将其作为主体传递,从而允许 fetch
计算门后面的 Content-Length
关于这个主题的一些更新,因为我自己正在寻找答案。这似乎是一条相当普遍的错误消息,可能的原因不止一个。
对于 javascript api,2012 年 12 月 24 日修复了空主体的错误:
最近在 iOS 8 上,存在积极(和非标准)缓存的问题,亚马逊不喜欢这一点。如果之前有任何 GetObject,则为同一对象/url 的后续请求发送 If-Modified-Since 标头,即使对于 PUT 请求也是如此:
我在 Perl 中使用 CPAN 的 Net::Amazon::S3::Client 时遇到了这个问题。我检查了请求和响应,并将问题拼凑在一起,那就是我缺乏通过 HTTPS 请求的能力。我通过安装 LWP::Protocol::https 修复了它。
我也遇到了这个问题,在node js代码中实现putObject时,发现我没有对JSON正文进行stringfy,这导致了同样的错误。
对于那些仍然参与此主题的人,根据我的
DELETE
请求,我在 S3 中一遍又一遍地遇到此问题。这是整个 github 问题,带有 Charles Proxy 屏幕截图/Reactotron。
基本上,我使用 aws-amplify 的
list
函数列出文件夹分支下的所有文件,然后迭代循环它们并使用以下方法删除:
for (const file of files) {
remove({ path: file.path })
}
然后,大约 50% 的情况下,
remove
函数调用会附加 if-modified-since
和 if-none-match
标头,并且服务器会返回 501 标头未实现错误。然后,如果我再试一次(也就是点击调用该函数的 ui 删除按钮,它通常会在第二次尝试时起作用。我非常讨厌这个错误,并且会向知道这是如何发生的人发送一个吻。我如何才能客户端随机附加这些标头?
你们中的许多人提到,如果
content-length
为 0,则可能会发生这种情况,但无论 content-length
是否为 0,它都会随机发生。