Изображения, загруженные на S3 с помощью MongoDB Stitch, не могут быть открыты - PullRequest
0 голосов
/ 11 января 2019

Я использую MongoDB Stitch для загрузки изображений с помощью React Native, и я могу успешно загрузить текст и то, что выглядит как изображение, но я не могу открыть изображение из S3.

Я использую следующий код из их примера в функции Stitch (https://docs.mongodb.com/stitch/services/aws/):

exports = async function(key, body) {
  const s3 = context.services.get('MY_S3_SERVICE').s3("us-east-1");
  try {
    const result = await s3.PutObject({
      "Bucket": "my_bucket_on_s3",
      "Key": key,
      "Body": body
    });
    console.log(EJSON.stringify(result));
    return result;
  } catch(error) {
    console.error(EJSON.stringify(error));
  }
};

Со стороны клиента я использую response-native-image-picker , чтобы выбрать изображение и загрузить его следующим образом:

handleSelectedImage = response => {
    if (response.didCancel) {
      console.log('User cancelled image picker')
    } else if (response.error) {
      console.log('ImagePicker Error: ', response.error)
    } else if (response.customButton) {
      console.log('User tapped custom button: ', response.customButton)
    } else {
      const source = { uri: response.uri }
      //const s = { uri: 'data:image/jpeg;base64,' + response.data }

      const imageId = generateUniqueId()
      const fileType = '.jpg'
      const key = imageId + fileType

      uploadImage(key, source.uri).then(result => {
        console.log('Did upload image!', result)
      })
    }
  }

И функция на стороне клиента, которая вызывает функцию Stitch:

export const uploadImage = (key, body) => {
  const client = Stitch.defaultAppClient
  return client.callFunction('uploadImage', [key, body])
}

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

enter image description here

1 Ответ

0 голосов
/ 05 апреля 2019

Вы должны преобразовать изображение base64 в BSON.Binary:

context.services.get("MY_S3_SERVICE").s3("us-east-1").PutObject({
    Bucket: "my_bucket_on_s3",
    Key: "hello.jpg",
    ContentType: "image/jpeg",
    Body: BSON.Binary.fromBase64("iVBORw0KGgoAA... (rest of the base64 string)", 0),
})
...