javascript - 如何使用 Fetch API 将照片上传到 AWS S3?

标签 javascript amazon-web-services amazon-s3 fetch-api

我正在尝试使用 Fetch API 将照片文件上传到 S3 存储桶。尝试上传照片时,我在 POST 上收到 400 Bad Request。我正确获取了预签名的帖子网址和文件详细信息,但我相信我格式化 formData 的方式不正确。

我正在使用一个 html 文件输入,它使用 onchange 来运行一个 javascript 函数 handlePhoto。

html是

<input type="file" onchange="handlePhoto()" id="file_input"/>

和javascript函数是
function handlePhoto(){
    const file = document.getElementById('file_input').files[0]
    let formData = new FormData()
    fetch("/v1/photos/get_presigned_post/" , {
      method: "GET"
    })
    .then(response => response.json())
    .then(s3Result => {
      const { url, fields } = s3Result;
      Object.keys(s3Result.fields).forEach(key => {
        formData.append(key, s3Result.fields[key]);
      });
      formData.append('acl', 'public-read');
      formData.append('Content-Type', file.type);
      formData.append("file", file);

      fetch(url, {
        method: "POST",
        body: formData,
        headers: {
          "Content-Type": "multipart/form-data"
        }
      })
  });
}

任何帮助将不胜感激。

最佳答案

您不需要使用 FormData,只需使用内容类型“八位字节流”传递文件。
生成签名 URL 时必须使用 acl。

fetch(url, {
                method: 'PUT',
                body: file,
                headers: { 'Content-Type': 'application/octet-stream' }
            })

关于javascript - 如何使用 Fetch API 将照片上传到 AWS S3?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61648607/

相关文章:

javascript - 没有javascript的CSS菜单下划线幻灯片?

javascript - 无限(可滚动)Div,没有任何带有 Javascript/JQuery 的插件

javascript - Vuetify 底部导航切割内容

ios - Swift 2.2 Xcode 7.3 中的 AWS S3 集成给出错误

flash - 无法使用Flash上​​传到S3

r - 如何在R中使用sparklyr读取S3文件夹/存储桶中的所有文件?

javascript - 实现 toJSON() 方法是否足以使任何类实例可序列化?

amazon-web-services - ETL : Flatten a nested array in an AWS glue job

java - 从java aws lambda访问s3

amazon-web-services - 哪个查询更快 : top X or limit X when using order by in Amazon Redshift