4

私は一般的にノードとプログラミングを行っており、これに本当に苦労しています...

https 応答を取得し、graphicsmagick でサイズを変更して、Amazon S3 バケットに送信したいと考えています。

https res は IncomingMessage オブジェクト (それに関する情報は見つかりません) であり、graphicsmagick の stdout はソケットのようです。

奇妙なことに、パイプを使用して、これらの両方をローカル パスを使用して writeStream に送信できます。res と stdout の両方で、新しいサイズ変更された素敵なイメージが作成されます。

また、(knox を使用して) res を S3 に送信することもでき、動作します。

しかし、stdout は S3 に行きたくない :-/

どんな助けでも大歓迎です!

https.get(JSON.parse(queryResponse).data.url,function(res){

    var headers = {
        'Content-Length': res.headers['content-length']
        , 'Content-Type': res.headers['content-type']
    }

    graphicsmagick(res)
      .resize('50','50')
      .stream(function (err, stdout, stderr) {

        req = S3Client.putStream(stdout,'new_resized.jpg', headers, function(err, res){
        })
        req.end()
    })

})

knox - S3 への接続用 – https://github.com/LearnBoost/knox graphicsmagick - 画像操作用 – https://github.com/aheckmann/gm

4

3 に答える 3

4

問題は、Amazon が事前にコンテンツの長さを知る必要があるという事実にありました (DarkGlass に感謝)

ただし、私の画像は比較的小さいため、MultiPartUpload よりもバッファリングが優先されることがわかりました。

私の解決策:

https.get(JSON.parse(queryResponse).data.url,function(res){

    graphicsmagick(res)
      .resize('50','50')
      .stream(function (err, stdout, stderr) {

        ws. = fs.createWriteStream(output)

        i = []

        stdout.on('data',function(data){
          i.push(data)
        })

        stdout.on('close',function(){
          var image = Buffer.concat(i)

          var req = S3Client.put("new-file-name",{
             'Content-Length' : image.length
            ,'Content-Type' : res.headers['content-type']
          })

          req.on('response',function(res){  //prepare 'response' callback from S3
            if (200 == res.statusCode)
              console.log('it worked')
          })
          req.end(image)  //send the content of the file and an end
        })
    })
})
于 2013-02-04T22:37:55.230 に答える
2

サイズ変更された画像ではなく、元の画像から Content-Length を設定しているようです

たぶんこれが役立つ

ストリームのコンテンツの長さを取得します

https://npmjs.org/package/knox-mpu

于 2013-02-04T17:25:57.277 に答える
0

あなたはそこでやるべきではありませんreq.end()。そうすることで、画像データを送信する前に S3 へのストリームを閉じます。endすべての画像データが送信されると、自動的に自動的に送信されます。

于 2013-02-04T06:25:48.630 に答える