загрузка изображения в S3 с помощью javascript AWS sdk приводит к появлению строки ‘[object object]’

#javascript #amazon-web-services #amazon-s3 #ionic3 #aws-sdk

#javascript #amazon-web-services #amazon-s3 #ionic3 #aws-sdk

Вопрос:

Следуя этому руководству, я пытаюсь загрузить изображение из моего приложения ionic в корзину amazon s3, используя следующий код:

 uploadFile(filePath) {
    console.log('uploading: ', filePath);
    this.getFile(filePath).subscribe((file) => {
       console.log('file is', file);

       this.s3.upload({
          Key: file.name,
          Bucket: this.bucketName,
          Body: file,
          ACL: 'public-read'
        }, (err, data) => {
           console.log('error', err);
           console.log('data', data);
     })
   });
}

getFile(filePath):Observable<any> {
  return Observable.create((obs) => {
    (<any>window).resolveLocalFileSystemURL(filePath,(fileEntry) => {
      fileEntry.file((fileObject) => {
        obs.next(fileObject);
      })
    })
  });
}
  

Это нормально подключается к aws, но загружаемый файл представляет собой просто текстовый файл с [object object] вместо данных изображения в формате jpeg. для контекста filePath аргументу передается путь к файлу к изображению, которое генерируется с помощью @ionic-native/camera библиотеки Ionic 3, и я запускаю код через эмулятор Android, если это имеет какое-либо значение.

Я почти уверен, что передаю в Body свойство не тот тип объекта, когда выполняю загрузку, но я не могу понять, каким он должен быть. В документации AWS говорится, что он должен принимать тип Blob , но мой getFile метод возвращает File , который, по-видимому, является экземпляром Blob , поэтому я решил, что он должен работать нормально?

Ответ №1:

Похоже, что GetFile метод возвращает File объект, а не большой двоичный объект. Итак, когда вы пишете :

 Body: file,
  

на самом деле вы передаете этот объект JS, а не большой двоичный объект.
Доказательством того, что это объект, является то, что file.name действительно возвращает имя.

Я бы посоветовал вам взглянуть на документ fileEntry.file , чтобы проверить, как вы можете получить доступ к массиву байтов из File возвращаемого объекта.

Из документации Cordova :

file: Creates a File object containing file properties.

Возможно, FileReader это позволит вам действительно прочитать файл. https://cordova.apache.org/docs/en/1.8.1/cordova/file/filereader/filereader.html

Комментарии:

1. Вы были правы! Раньше я FileReader считывал файл как буфер массива, и передача этого в Body , похоже, работала. Однако это странно, потому что в документах aws sdk говорится, что это Body должно быть принято Blob , экземпляром которого File является. Я бы подумал, что это File тоже должно сработать.