Как загрузить любой тип файла в корзину S3 через клиентскую JavaScript? - PullRequest
0 голосов
/ 16 апреля 2020

У меня проблемы с чтением файла через FileReader и загрузкой его на S3 через PutObject без повреждения файла.

Описание проблемы

Я был используя MongoDB Stitch в качестве моей серверной платформы с моим приложением, и оно поставляется встроенным с поставщиком услуг S3. Я могу правильно загрузить текстовые файлы, но если я попытаюсь загрузить любой двоичный файл (Excel, PDF, изображения и т. Д. c.) И загрузить его прямо из моего хранилища S3 и открыть его в соответствующей программе, мой компьютер сообщит об этом как поврежден.

Я просмотрел оба файла: исходный на моем компьютере и загруженный на S3, и они очень похожи, но, похоже, некоторые данные были изменены при загрузке.

Текущие попытки

Я использую FileReader, чтобы открыть поток чтения, и FileReader.readAsBinaryString(), чтобы прочитать файл. Мой ContentType в заголовках установлен на исходный тип файла (например, для .txt, text/plain; для .jpg, .jpeg) через File.type.

Я видел, что W3 C рекомендует использовать FileReader.readAsArrayBuffer() вместо readAsBinaryString(), но S3 сообщает об ошибке при попытке загрузить полученные данные: value for field "Body" should be of type "io.ReadSeeker".

Я также пытался FileReader.readAsDataURL(), но я не знаю, как преобразовать 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 так же, как он хранится в моей файловой системе? или универсальный c метод для кодирования / декодирования любого типа файла в / из base64?

1 Ответ

0 голосов
/ 16 апреля 2020

Я нашел FilePond и похожие библиотеки, и, поскольку он поддерживает любой тип загрузки на сервер, я решил использовать его, а не пытаться создавать файлы загрузки файлов c сам.

ОБНОВЛЕНИЕ :

Даже FilePond позволяет вам определять свои собственные AWS загрузить логи c ... Но я наконец-то понял это.

При использовании MongoDB Stitch вы должны преобразовать ArrayBuffer для UInt8Array, затем двоичный тип BSON, использующий их SDK. Вот код:

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)
...