2016-08-23 15 views
1

私の質問に対する満足のいく回答は見つかりません。画像URLがあれば、(ディスクに保存せずに)ダウンロードしてすぐにAWS Bucketにアップロードしたいと考えています。私のコードは次のとおりです。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 
     } 
    } 

画像が壊れているような場合を除いて、すべて正常に動作します。これまでのところ私が試した:

  • 画像

  • それを使用するとのテキストの内容を渡さないための良い戦略と思われ、ダウンロードする際nullにエンコーディングを設定するために、aldeed:httpを使用します応答を直接アップロード体として

  • AWS

Sにbase64エンコーディングを追加します堕落するまで私はソリューションに非常に近い感じがします。画像は正しいタイプとファイルサイズですが、ブラウザやコンピュータでは印刷されません。どのように正しくデータをエンコード/取得するかについての任意のアイデア?

答えて

2

オーケー、私は自分で答えを見つけました:

aldeed:meteorget要求にresponseTypeパラメータを追加することができます。このオプションをbufferに設定するだけで、データをバッファーにするだけです。次に、変換なしのこのバッファにアップロード機能のBodyを渡すだけです。

関連する問題