AWS S3 图像上传错误:不支持的正文负载对象

Posted

技术标签:

【中文标题】AWS S3 图像上传错误:不支持的正文负载对象【英文标题】:AWS S3 Image Upload Error: Unsupported Body Payload Object 【发布时间】:2021-03-12 02:27:58 【问题描述】:

我尝试将本地图像上传到 s3 存储桶并不断获取 Error: Unsupported body payload object

图像可以是jpgjpegpng。我读过图像只能作为base64 上传到s3,所以我使用readAsDataURL 将文件作为base64 字符串读取,然后用它创建一个缓冲区。

const reader = new FileReader()
reader.readAsDataURL(file)
const base64str = reader.result.replace(/^data:image\/\w+;base64,/, "");
const fileContent = Buffer.from(base64str,'base64')

上面的代码在 react 前端执行,fileContent 通过钩子设置为一个变量,然后该变量被 PUT 到我的服务器上

static uploadImage = (id, fileContent) => 
  return axios.put(ROOT_URL + "/images/" + id, fileContent);

然后上传

await s3.upload(
  Bucket: BUCKET_NAME,
  Key: KEY,
  Body: fileContent,
  ContentType: TYPE,
).promise();

我尝试了许多在此网站上找到的不同解决方案,但仍然收到错误消息。不知道我错过了什么。

编辑:这是我发现有用的线程之一,但没有修复错误。 Uploading base64 encoded Image to Amazon S3 via Node.js

【问题讨论】:

【参考方案1】:

不确定您在哪里读到的图像必须是 base64,但您可以简单地使用 fs 之类的内容读取文件内容,然后按原样将其上传到 S3。

// Read content from the file
const fileContent = fs.readFileSync(fileName);

// Setting up S3 upload parameters
const params = 
  Bucket: BUCKET_NAME,
  Key: 'cat.jpg', // File name you want to save as in S3
  Body: fileContent
;

// Uploading files to the bucket
await s3.upload(params).promise();

【讨论】:

我不认为这是可能的,我在前端读取文件反应所以我不能使用fs @Spartan26783 您的问题是该文件通过 PUT 请求放在服务器上,然后放在 S3 上。我假设这发生在已经在服务器上之后。 “上面的代码在反应前端执行,其中fileContent 通过钩子设置为一个变量,并且该变量被 PUT-ed 到我的服务器”所以我将文件设置为变量使用 react hook,然后使用 put 请求将其发送到服务器。 有什么更新吗?我现在尝试了更多解决方案。知道为什么 AWS 可能不接受 base64 字符串吗?还在寻找fs的解决方法,我唯一能想到的是FileReader

以上是关于AWS S3 图像上传错误:不支持的正文负载对象的主要内容,如果未能解决你的问题,请参考以下文章

用于将 svg 图像上传到 AWS S3 的内容类型

从 url 下载文件并将其上传到 AWS S3 而不保存 - node.js

AWS S3存储桶Django 3.0用户配置文件图像上传访问错误

Javascript AWS SDK S3上传方法与正文流生成空文件

从浏览器缓存提供图像时,AWS S3 + CloudFront 会出现 CORS 错误

AWS S3 getSignedUrl() 返回 403 禁止错误