#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
тоже должно сработать.