Не удается загрузить изображения в s3 через службу stitch aws

Извините, я новичок, но я создаю интерфейс квазара, используя mongodb stitch в качестве бэкенда.

Я пытаюсь загрузить изображение с помощью stitch javascript sdks и AwsRequest.Builder.

Quasar дает мне объект изображения с данными в кодировке base64.

Я удаляю строку заголовка из строки base64 (часть, которая говорит «data: image / jpeg; base64,»), конвертирую ее в двоичный и загружаю в корзину aws s3.

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

Только загруженное мной изображение нельзя ни открыть в S3, ни открыть после загрузки.

Кажется, что трудности заключаются в преобразовании в двоичный код строки base64 и / или в выборе правильных параметров загрузки для стежка.

Вот мой код:

      var fileSrc = file.__img.src  // valid base64 encoded image with header string
      var fileData = fileSrc.substr(fileSrc.indexOf(',') + 1) // stripping out header string
      var body = BSON.Binary.fromBase64(fileData, 0) // here I get the BSON error

      const args = {
        ACL: 'public-read',
        Bucket: 'elever-erp-document-store',
        ContentType: file.type,
        ContentEncoding: 'x-www-form-urlencoded', // not sure about the need to specify encoding for binary file
        Key: file.name,
        Body: body
      }

      const request = new AwsRequest.Builder()
        .withService('s3')
        .withRegion('eu-west-1')
        .withAction('PutObject')
        .withArgs(args)

      aws.execute(request.build())
        .then(result => {
          alert('OK ' + result)
          return file
        }).catch(err => {
          alert('error ' + err)
        })

В приведенном выше фрагменте я пытаюсь использовать BSON.Binary.fromBase64 для преобразования в двоичный файл в соответствии с предложением Хейли ниже, но получаю следующую ошибку:

boot_stitch__WEBPACK_IMPORTED_MODULE_3__["BSON"].Binary.fromBase64 is not a function.

Я также пробовал другие способы преобразовать строку base64 в двоичную форму, например, функцию vanilla atob () и модуль BUFFER npm, но без особого удовольствия.

Я, должно быть, где-то делаю что-то глупое, но не могу найти выхода.


person Bruno Ronchetti    schedule 30.03.2019    source источник


Ответы (2)


У меня была аналогичная проблема, я решил ее, создав буфер из данных base64, а затем использовал new BSON.Binary(new Uint8Array(fileBuffer), 0) для создания двоичного объекта BSON.

Используя OP, это будет выглядеть примерно так:

var fileSrc = file.__img.src  // valid base64 encoded image with header string
var fileData = fileSrc.substr(fileSrc.indexOf(',') + 1) // stripping out header string
var fileBuffer = new Buffer(fileData, 'base64');
var body = new BSON.Binary(new Uint8Array(fileBuffer), 0)
person Matt T    schedule 31.03.2020

Вы должны иметь возможность преобразовать изображение base64 в BSON.Binary, а затем загрузить фактическое изображение таким образом (у меня есть некоторые значения, жестко запрограммированные, но вы можете их заменить):

context.services.get("<aws-svc-name>").s3("<your-region>").PutObject({
    Bucket: 'myBucket',
    Key: "hello.png",
    ContentType: "image/png",
    Body: BSON.Binary.fromBase64("iVBORw0KGgoAA... (rest of the base64 string)", 0),
})
person haley    schedule 05.04.2019
comment
Спасибо, Хейли. Как я понял из вашего сообщения, мне нужно преобразовать base64 в объект BSON. К сожалению, в моей реализации BSON (node.js) нет функции Binary.fromBase64. В ближайшие дни мы рассмотрим это подробнее. Еще раз спасибо. - person Bruno Ronchetti; 07.04.2019
comment
Итак, я попытался импортировать такой BSON из пакета mongodb-stitch-browser-core: import { stitchClient, RemoteMongoClient, AwsServiceClient, AwsRequest, BSON } from 'boot/stitch' but I still get TypeError: boot_stitch__WEBPACK_IMPORTED_MODULE_3 __ [BSON] .Binary.fromBase64 не является функцией. - person Bruno Ronchetti; 08.04.2019
comment
Ах, не могли бы вы показать мне, как вы передаете аргументы? Ответ, который я вам дал, был бы, если бы вы использовали функцию стежка. - person haley; 08.04.2019
comment
Спасибо, Хейли, за продолжение и извинения за путаницу. Я отредактировал свой вопрос выше для ясности и чтобы иметь возможность вставить больше кода. - person Bruno Ronchetti; 09.04.2019
comment
Попробуйте: new BSON.Binary(fileData, 0x00) - person haley; 13.04.2019
comment
Спасибо, Хейли. В конце концов, я отказался от SDK для javascript. Вместо этого при использовании службы стежка и функций стежка он работает так, как рекламируется. - person Bruno Ronchetti; 13.04.2019
comment
Что ж, почти как разрекламировано. Загрузка работает нормально с фрагментом из документации. Загрузка также работает как двоичная, но когда я пытаюсь получить строку в кодировке base64 с помощью BSON.Binary.tobase64 (задокументировано здесь: docs.mongodb.com/stitch/functions/utilities/#bson) Я получаю сообщение об ошибке: StitchError: TypeError: 'toBase64' не является функцией. - person Bruno Ronchetti; 16.04.2019