Изображение неправильно загружено в s3 с помощью хранилища для усиления (React Native - Expo - Amplify) - PullRequest
1 голос
/ 01 апреля 2019
  • Я пытаюсь загрузить изображение на s3 с помощью Amplify Storage API.
  • Я использую EXPO imagePicker для загрузки изображения с телефона в React-Native, и оно отображается правильно.
  • Затем я загружаю его в s3 с помощью ampify Storage.put, и он достигает нужной папки в s3, с правильным именем файла, которое я ему дал, и с открытым доступом, предоставленным мною (к изображению и самому контейнеру).
  • НО, если я попытаюсь открыть фото URI в S3, он не отображается. Когда я проверяю браузер, он показывает эту ошибку на консоли:

  • Если я вставлю в браузер URI, полученный из Storage.get, я получу эту ошибку:

  _handleImagePicked = async (pickerResult) => {
    const s3path = 'fotos_cdcc/' + '186620' + '/'
    const imageName = '186620_4' + '.jpeg'
    const key = s3path + imageName
    const fileType = pickerResult.type;
    const access = { level: "public", contentType: 'image/jpg' };
    const imageData = await global.fetch(pickerResult.uri)
    const blobData = await imageData.blob()

    try {
      await Storage.put(
        key, 
        blobData, 
        access,
        fileType
        ).then(result => console.log(result))
    } catch (err) {
      console.log('error: ', err)
    }
  }
  • PickerResult имеет такую ​​форму:
Object {
"cancelled": false,
"height": 750,
"type": "image",
"uri": "file:///var/mobile/Containers/Data/Application/021D6288-9E88-4080-8FBF-49F5195C2073/Library/Caches/ExponentExperienceData/%2540anonymous%252Fcaballos-app-dd2fa92e-4625-47e7-940e-1630e824347a/ImagePicker/D9EE1F24-D840-457F-B884-D208FFA56892.jpg",
"width": 748,
}
  • Я попытался опубликовать корзину и фотографию в s3, но ошибка не исчезла.

Есть идеи?

Заранее спасибо!

1 Ответ

1 голос
/ 15 июня 2019

Возможно, это не проблема с aws-усилением, а с fetch и blob. Вы можете попробовать это?

function urlToBlob(url) {
  return new Promise((resolve, reject) => {
      var xhr = new XMLHttpRequest();
      xhr.onerror = reject;
      xhr.onreadystatechange = () => {
          if (xhr.readyState === 4) {
              resolve(xhr.response);
          }
      };
      xhr.open('GET', url);
      xhr.responseType = 'blob'; // convert type
      xhr.send();
  })
}

Тогда вместо

const imageData = await global.fetch(pickerResult.uri)
const blobData = await imageData.blob()

Попробуйте

const blobData = await urlToBlob(pickerResult.uri)

Пожалуйста, найдите полное обсуждение https://github.com/expo/firebase-storage-upload-example/issues/13

...