Я не могу найти удовлетворительный ответ на мой вопрос. Учитывая URL-адрес изображения, я хочу загрузить его (не сохраняя его на диск) и немедленно загрузить его в ведро AWS. Вот мой код:Загрузите изображение с его URL-адреса и загрузите его прямо в AWS
self.downloadImage = function(url){
let response = HTTP.get(url, {
encoding:null // for binary
})
if (!response.headers['content-type'].split('/')[0] == 'image'){
throw new Error("not an image")
}
return {
data : response.content,
contentType : response.headers['content-type']
}
}
self.uploadImage = function(websiteName, imgUrl, callback){
// we retrieve the image
let image = downloadImage(imgUrl)
let imageName = self.extractImageName(imgUrl)
let filename = 'img/' +websiteName + "/" + imageName
let newUrl = `https://s3.${Meteor.settings.AWS.REGION}.amazonaws.com/${Meteor.settings.S3.BUCKET_NAME}/${filename}`
// makes the async function sync like
let putObjectSync = Meteor.wrapAsync(s3Client.putObject, s3Client)
try{
let res = putObjectSync({
Body: image.data,
ContentType : image.contentType,
ContentEncoding: 'base64',
Key: filename,
ACL:'public-read',
Bucket: Meteor.settings.S3.BUCKET_NAME
})
return newUrl
} catch(e) {
return null
}
}
Все работает нормально, за исключением того, что изображение кажется поврежденным. До сих пор я пытался:
использовать
aldeed:http
для того, чтобы установить кодировкуnull
при загрузке, который, кажется, хорошая стратегия для изображенийне использовать его и передать текстовое содержимое ответ непосредственно в качестве загрузки тела
, чтобы добавить кодирование base64 в AWS
S до коррумпированных. Я чувствую себя очень близко к решению, поскольку изображение как правильный тип и размер файла, но все равно не будет печататься в браузере или на моем компьютере. Любая идея о том, как правильно кодировать/извлекать данные?