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

Posted

技术标签:

【中文标题】上传时出现 Amazon S3 存储桶 MalformedXML 错误【英文标题】:Amazon S3 bucket MalformedXML error when uploading 【发布时间】:2015-10-28 14:40:57 【问题描述】:

我正在尝试将图片上传到我的 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】:

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

要上传文件,您的 XHR 公开调用应该看起来更像:

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

documentation 中有一个示例请求。

【讨论】:

好收获。问题 #2 在修复之后是 S3 存储桶不期望 PUT 请求上的“表单数据”。他们希望请求正文包含正在上传的对象的原始八位字节。 我大部分时间都在使用 javascript API,而不是直接发送 REST 请求。不确定您的表单数据是什么样的,但docs.aws.amazon.com/AmazonS3/latest/API/sigv4-post-example.html 的示例可能会让您朝着正确的方向前进? 我遇到了 Java SDK。我没有发送存储桶名称。

以上是关于上传时出现 Amazon S3 存储桶 MalformedXML 错误的主要内容,如果未能解决你的问题,请参考以下文章

使用 AlamoFire 和预签名 URL 将图像上传到 S3 存储桶时出现问题

在 Heroku 和 Amazon S3 上的生产 Rails/Vue 应用程序中加载字体时出现 CORS 错误

从 Nuxt 上传到 AWS S3 存储桶时出现 500 内部服务器错误

Amazon S3 存储桶大文件上传

将图像上传到 Amazon S3 时出现 NotAuthorizedException

使用 amazon sdk 和存储桶策略从 ios 应用程序将图像上传到 amazon s3