2012-02-28 14 views
4

リクエストとknoxを使用して、URLからs3にファイルをアップロードする方法を考案しようとしています。現在、私のコードは次のようになります。それはそれは停止する前に、4KBのファイルのおよそ652バイトをダウンロードするように、これは動作しませんNodeJS:リクエストとknoxを使ってS3にリモートファイルをアップロードする

request(item.productImage, function(err, res, body) { 
    if (!err && res.statusCode == 200) { 
    fs.writeFile('/tmp/' + filename, body, 'base64', function(err, data){ 
     if (err) { 
     return console.log(err); 
     } 

     client.putFile('/tmp/' + filename, '/item/' + item._id + '/' + filename, function(err, res) { 
     if (err) { 
      return console.log(err); 
     } 
     }); 
    }); 
    } 
}); 

。不思議なことに、私がfs.writeFile()にコールバックを提供しないと、ローカルに4kb全体をダウンロードします。

これを達成する最もよい方法は何ですか?

+0

ご質問ありがとうございます。私は同じ質問をしようとしていた、私はここで答えを得た。 – user644745

答えて

10

Stackoverflowにはこれに関する多くの質問がありますが、私はあなたの質問に答えるものを見つけることができないようです。 以下の解決策はでなければなりませんが、私のマシン上でknockが全く動作しなくなっています。私はあなたがもっと幸運になることを願っています!

UPDATE:は、私がここにS3といくつかの問題を抱えているように見える、以下のコードは動作します - 私は一つのことを変更しなかった、あなたはBufferを取り戻すよう、要求するnullとしてencodingを指定する必要があります。そうしないと、バイナリデータがうまく動作しません。

request(item.productImage, {encoding: null}, function(err, res, body) { 
    if(!err && res.statusCode == 200) { 
    var req = client.put('/item/' + item._id + '/' + filename, { 
     'Content-Type': res.headers['content-type'], 
     'Content-Length': res.headers['content-length'] 
    }); 

    req.on('response', function(res) { 
     console.log('response from s3, status:', res.statusCode, 'url:', req.url); 
    }); 

    req.on('error', function(err) { 
     console.error('Error uploading to s3:', err); 
    }); 

    req.end(body); 
    } 
}); 

注:このソリューションを使用すると、ディスクにファイルをバッファリングすることを避ける - 私はノックスクライアントの下位レベルput方法を使用することを選択した理由です。

+1

優れています。 S3またはKnoxのどちらかがそれに敏感であるように、私は 'content-type'と 'content-length'の大文字を変更する必要がありました。私がやるまでは、私は403エラーを受けていました。 – James

+0

おっと、私は実際にテストプログラムでそれを持っていました。上記で編集されました。ありがとう。 –

+0

私もこれを使用しています。しかし、私は403ステータスコードを取得しています.... urlもすべて正しいとは思われません。 "S3からの応答、ステータス:403 url:http://zzzzzz.s3.amazonaws.com \ static \ ima ges \ thumbnail \ abcd.jpg" – user644745

関連する問題