2

これが私がやろうとしていることです:

  1. API で指定された URL から画像の生データ (jpeg) を取得する
  2. 生データまたはバッファを別のサーバーにアップロードする関数に渡します
  3. イメージをディスクにパイプしないでください

私が見つけたすべての例(ディスクにパイプしない)に従いましたが、それでもコンテンツは破損しています。さまざまな「accept-encodings」(gzip、deflate)を強制しようとしましたが、基本的には圧縮された同じデータに解決されます。

これは、データの要求方法ではなく、応答のエンコーディングに関係していると思います。

これまでのコードは次のとおりです。

var parsedUrl = require('url').parse(PATH_TO_IMAGE)
var params = {     
  hostname: parsedUrl.hostname,
  path: parsedUrl.path,                                                                                                                                                                                        
}                  

return http.get(params, function(photo_res) {
  var photoData = '';
  res.setEncoding('binary');

  photo_res.on('data', function(chunk) {
    photoData += chunk;
  });              

  photo_res.on('end', function() {
    // DO STUFF TO UPLOAD IMAGE            
  });              

  photo_res.on('error', function(err) {
    console.error('Unable to download photo:', err);
    return done(err);
  });              
});
4

1 に答える 1

0

Nodeがデータストリームを間違ったタイプで解釈する原因となっている可能性のある単純なタイプミスがあります。エラーは次の行にあります。

res.setEncoding('binary');

混乱を避けるために、応答変数の名前は のままにしておく必要がresあります。データはバイナリ形式であるため、バッファとして保持する方がよい場合があります。

http.get(options, function(res) {
  var photoData = [];

  res.setEncoding('binary');
  res.on('data', function(chunk) {
    photoData.push(chunk);
  });              

  res.on('end', function() {  
    var photo = Buffer.concat(photoData);       
  });              

  res.on('error', function(err) {
    console.error('Unable to download photo:', err);
  });              
});

この例では、データのすべてのチャンクを配列に格納し、それを使用Buffer.concat()して 1 つのバッファーを作成します。もともと画像のデータを文字列に追加していたため、破損の原因となった可能性があるため、この方法が適しています。

于 2013-09-24T01:22:11.407 に答える