Amazon S3 在 PUT 上出现 501 错误

问题描述 投票:0回答:7

在测试新应用程序时,一位测试人员总是上传到 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 和字符串 - “您提供的标头暗示了不属于的功能 已实施”

iphone ios amazon-s3
7个回答
9
投票

如果未提供 Content-Length,可能会发送来自 Amazon 的 501 响应代码。

既然你这么说,我建议通过代理运行请求(Mac 的 Charles 或 Windows 的 Fiddler)并确保发送的请求实际上包含 Content-Length 标头


8
投票

响应正文包含 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];

4
投票

as @Alon Burg 指出,S3 期望设置

Content-Length
标头。你不能直接使用流(或者我不知道如何);
Fetch
(或节点获取)当传入
ReadStream
作为主体时,它将
transport-encoding
标头设置为 S3 不支持的
chunked
(当使用
putObject
时)。

解决方法是首先将

ReadStream
转换为
Buffer
(或字符串)并将其作为主体传递,从而允许
fetch
计算门后面的
Content-Length


3
投票

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

对于 javascript api,2012 年 12 月 24 日修复了空主体的错误:

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


1
投票

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


0
投票

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


0
投票

对于那些仍然参与此主题的人,根据我的

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,它都会随机发生。

© www.soinside.com 2019 - 2024. All rights reserved.