2016-08-23 3 views
1

Я не могу найти удовлетворительный ответ на мой вопрос. Учитывая 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 до коррумпированных. Я чувствую себя очень близко к решению, поскольку изображение как правильный тип и размер файла, но все равно не будет печататься в браузере или на моем компьютере. Любая идея о том, как правильно кодировать/извлекать данные?

ответ

2

Хорошо, я нашел ответ сам:

aldeed:meteor позволяют добавить параметр responseType к get запросу. Нам просто нужно установить этот параметр в buffer, чтобы мы получили данные в виде буфера. Затем мы просто передаем этот буфер без преобразования в качестве функции загрузки Body.

Смежные вопросы