如何通过客户端JavaScript将任何类型的文件上传到S3存储桶?

时间:2020-04-16 20:25:00

标签: javascript file amazon-s3 filereader mongodb-stitch

我无法通过FileReader读取文件,并且无法通过PutObject将其正确上传到S3,而文件没有损坏。

问题描述

我一直在使用MongoDB Stitch作为我的应用程序的无服务器平台,并且它内置有S3服务提供商。我可以正确地上传文本文件,但是如果我尝试上传任何二进制文件(Excel,PDF,图像等)并直接从S3存储桶中下载并在其相应程序中打开,则我的计算机报告该文件已损坏。 / p>

我已经查看了这两个文件,它们是我计算机上的原始文件,另一个是上传到S3的文件,它们非常相似,但是似乎上传中的某些数据已更改。

当前尝试

我正在使用FileReader打开读取流,并使用FileReader.readAsBinaryString()读取文件。标头中的我的ContentType通过.txt设置为原始文件类型(例如,text/plain.jpg.jpegFile.type

我已经看到W3C建议使用FileReader.readAsArrayBuffer()而不是readAsBinaryString(),但是S3在尝试上传结果数据时报告错误:value for field "Body" should be of type "io.ReadSeeker"

我也尝试过FileReader.readAsDataURL(),但是我不知道将 any 文件类型的base64 URL转换回其原始格式的方法。我能找到的唯一示例都涉及使用base64编码/解码图像。

代码

const readFile = (file) => {

  return new Promise((resolve) => {

    const fileReader = new FileReader()
    fileReader.onload = (event) => {
      resolve(event.target.result)
    }
    fileReader.readAsBinaryString(file)

  })

}

async s3Upload(file) {

  const fileData = await readFile(file)

  const putObjectArgs = {
    Body: fileData,
    Key: file.name,
    ContentType: file.type,
    ACL: 'public-read',
    Bucket: 'BUCKET_NAME',
  }

  // call the Stitch services to upload

}

问题

有没有一种方法可以将任何类型的文件上传到S3,就像存储在文件系统中一样?还是一种通用方法来将任何文件类型编码/解码到base64?/

1 个答案:

答案 0 :(得分:0)

我找到了FilePond和类似的库,并且由于它支持任何类型的服务器上载,所以我决定使用它,而不是尝试自己创建文件上载逻辑。

更新:

甚至FilePond也可以让您定义自己的AWS上传逻辑...但是我终于弄清楚了。

使用MongoDB Stitch时,必须将ArrayBuffer转换为UInt8Array,然后使用其SDK转换为BSON Binary类型。这是代码:

const reader = new FileReader()

reader.onload = (e) => {
  const fileData = new Uint8Array(reader.result)
  const fileBson = new BSON.Binary(fileData)

  // upload to S3
  // ...
}

reader.readAsArrayBuffer(file)
相关问题