上传 Amazon S3 存储桶时出现 MalformedXML 错误

9

我正在尝试将一张图片上传到我的Amazon S3存储桶中。以下是我用于XMLHttpRequest的代码:

var form_data = new FormData();
form_data.append(filename, file);
var xhr = new XMLHttpRequest();
xhr.open('PUT', 'https://bucket-name.s3.amazonaws.com', true);
xhr.send(form_data);

我已经配置了CORS如下:
<CORSConfiguration>
  <CORSRule>
    <AllowedOrigin>http://localhost:3000</AllowedOrigin>
    <AllowedMethod>GET</AllowedMethod>
    <AllowedMethod>PUT</AllowedMethod>
    <AllowedMethod>POST</AllowedMethod>
    <AllowedMethod>DELETE</AllowedMethod>
    <AllowedHeader>*</AllowedHeader>
  </CORSRule>
</CORSConfiguration>

很遗憾,当我试图上传到它时,我一直收到以下错误信息:
PUT https://bucket-name.s3.amazonaws.com 400 (Bad Request)
<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>MalformedXML</Code><Message>The XML you provided was not well-formed or 
did not validate against our published schema</Message><RequestId>6188AA51D1EE6B38</RequestId>
<HostId>f3d5Aj8bMyMOJywRnYKH/tBXRHCDWFvNzcb4ejs9F4/IulP1P2n0XoN1mDq7LpQgL/RIsW1c6RA=</HostId></Error>

有没有人知道我做错了什么?

1个回答

22

看起来你正在向存储桶本身发送PUT请求,但没有指定对象名称。S3将其解释为PUT BUCKET请求,并期望请求体是CreateBucketConfiguration XML文档。

如果要上传文件,你的XHR打开调用应该更像这样:

xhr.open('PUT', 'https://bucket-name.s3.amazonaws.com/' + filename, true);

文档中有一个示例请求,位于此处


很好的发现。问题#2,在修复它之后,是S3存储桶不期望在PUT请求上收到“表单数据”。他们希望请求正文包含正在上传的对象的原始八位字节。 - Michael - sqlbot
我主要使用Javascript API而不是直接发送REST请求。不确定你的表单数据长什么样子,但在http://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-post-example.html这个例子中可能会帮助你找到正确的方向? - pmcoltrane
我也遇到过Java SDK的这个问题。我没有发送存储桶名称。 - Rodrigo Asensio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接