web-dev-qa-db-ja.com

http.requestを使用してnode.jsでバイナリコンテンツを取得する

Httpsリクエストからバイナリデータを取得したいと思います。

私は、同様の質問を見つけました、リクエストメソッドを使用します リクエストを使用してNode.jsでバイナリコンテンツを取得する は設定ですencodingtonullは動作するはずですが、動作しません。

options = {
    hostname: urloptions.hostname,
    path: urloptions.path,
    method: 'GET',
    rejectUnauthorized: false,
    encoding: null
};

req = https.request(options, function(res) {
    var data;
    data = "";
    res.on('data', function(chunk) {
        return data += chunk;
    });
    res.on('end', function() {
        return loadFile(data);
    });
    res.on('error', function(err) {
        console.log("Error during HTTP request");
        console.log(err.message);
    });
})

編集: 'binary'へのエンコーディングの設定も機能しません

33
edi9999

受け入れられた答えは私にとっては機能しませんでした(つまり、エンコーディングをバイナリに設定します)。

ここから私のために働いたものがあります: http://chad.pantherdev.com/node-js-binary-http-streams/

http.get(url.parse('http://myserver.com:9999/package'), function(res) {
    var data = [];

    res.on('data', function(chunk) {
        data.Push(chunk);
    }).on('end', function() {
        //at this point data is an array of Buffers
        //so Buffer.concat() can make us a new Buffer
        //of all of them together
        var buffer = Buffer.concat(data);
        console.log(buffer.toString('base64'));
    });
});

編集:セミコロンの提案に従って回答を更新

60
Guaycuru

リクエストではなくレスポンスにエンコードを設定する必要があります:

req = https.request(options, function(res) {
    res.setEncoding('binary');

    var data = [ ];

    res.on('data', function(chunk) {
        data.Push(chunk);
    });
    res.on('end', function() {
        var binary = Buffer.concat(data);
        // binary is your data
    });
    res.on('error', function(err) {
        console.log("Error during HTTP request");
        console.log(err.message);
    });
});

役に立つ答えは次のとおりです。 ローカルサーバーへのイメージの書き込み

15
moka

AWS Lambda環境でNodeJS 6.10(および2019年2月にテスト済みの8.10)で実行しているが、上記のソリューションはどれも役に立たない。

私のために働いたのは次のことでした:

https.get(opt, (res) => {
    res.setEncoding('binary');
    let chunks = [];

    res.on('data', (chunk) => {
        chunks.Push(Buffer.from(chunk, 'binary'));
    });

    res.on('end', () => {
        let binary = Buffer.concat(chunks);
        // binary is now a Buffer that can be used as Uint8Array or as
        // any other TypedArray for data processing in NodeJS or 
        // passed on via the Buffer to something else.
    });
});

Res.setEncoding( 'binary');に注意してください。およびBuffer.from(chunk、 'binary')行。 1つは応答エンコードを設定し、もう1つは以前に指定されたエンコードで提供された文字列からBufferオブジェクトを作成します。

10
Pärt Johanson

PärtJohanson私は、髪を切り裂いて、これに関する(信じられないほど役に立たない)ノードドキュメントを何度も読んでいた1日でした再帰ループから私を救ってくれたことに感謝したいだけです。あなたの答えを見つけたら、私はドキュメントを掘り下げに行きましたが、_res.setEncoding_メソッドもどこにも文書化されていません!これは2つの例の一部として示されているだけで、res.setEncoding('utf8');を呼び出しています。

私はコメントするのに十分な評判がないので、少なくとも私の答えに役立つ何かを貢献します:PärtJohansonの答えは私のために100%働きました、私はそれをダウンロードしてNWJS 0.36.4でnw.Window.get().evalNWBin()を使用して、サーバーでホストされる(およびnwjcでコンパイルされる)スクリプトを評価します/ Node 11.11.0:

_let opt = {...};
let req = require('https').request(opt, (res) => {
  // server error returned
  if (200 !== res.statusCode) {
    res.setEncoding('utf8');
    let data = '';
    res.on('data', (strData) => {
      data += strData;
    });
    res.on('end', () => {
      if (!res.complete) {
        console.log('Server error, incomplete response: ' + data);
      } else {
        console.log('Server error, response: ' + data);
      }
    });
  }
  // expected response
  else {
    res.setEncoding('binary');
    let data = [];
    res.on('data', (binData) => {
      data.Push(Buffer.from(binData, 'binary'));
    });
    res.on('end', () => {
      data = Buffer.concat(data);
      if (!res.complete) {
        console.log('Request completed, incomplete response, ' + data.length + ' bytes received);
      } else {
        console.log('Request completed, ' + data.length + ' bytes received');
        nw.Window.get().evalNWBin(null, data);
      }
    });
  }
};

_

編集:P.S.誰かが非バイナリ応答を処理する方法を知りたい場合に備えてこれを投稿しました-私の実際のコードはもう少し深くなり、応答コンテンツタイプヘッダーをチェックしてJSON(意図的な障害、すなわち400、401、403)またはHTML(予期しない障害、つまり404または500)

2
caffeinatedbits
  1. デフォルトでは、エンコーディングは割り当てられず、ストリームデータはBufferオブジェクトとして返されます であるため、setEncoding()メソッドを呼び出さないでください。
  2. _on.data_コールバックメソッドでBuffer.from()を呼び出して、chunk値をBufferオブジェクトに変換します。
_http.get('my_url', (response) => {
  const chunks = [];
  response.on('data', chunk => chunks.Push(Buffer.from(chunk))) // Converte `chunk` to a `Buffer` object.
    .on('end', () => {
      const buffer = Buffer.concat(chunks);
      console.log(buffer.toString('base64'));
    });
});
_
0
Naijia Liu