node.jsのhttp.requestでバイナリをBufferに格納する

  • 5
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

任意URLのバイナリファイルをBufferで取得する方法。

古い方は非推奨の指定があるのでこちらで。

const http = require('http');
var options = {}; //いろいろ入ってるでしょう。
var req = http.request(options,
  function(res) {
    // Bufferの配列。
    var data = [];
    res.on('data', function (chunk) {
      data.push( chunk ); 
    });
    res.on('end', function () {
      // dataにはBufferがいくつかあるので、concatで結合可能。
      var buf = Buffer.concat( data );
    });
  });
req.end();

また単にダウンロードなら次のような形でも取得可能です。

import http from 'http';

http.get( 'http://...', function (res) {
    const data = [];
    res.on('data', function (chunk) { data.push( chunk ); });
    res.on('end', function () {
      const buf = (res.statusCode === 200) ? Buffer.concat( data ) : null;
    });
  });

古い

バイナリを結合したい

node.jsにてhttp.requestを使ってデータを受け取る際、chunkでデータを受け取れるが、これはres.setEncoding('binary')指定時にはバイナリのある程度つまった変数となる。
これをそのまま文字列の時のように+=でつなげばバイナリが壊れ、どっかのサンプルにあるようにchunkを配列に入れてあとでBuffer.concatしてもchunkはBufferじゃないので失敗してしまう。

そんな状況でバイナリをBufferに格納する。

const http = require('http');
var options = {}; //いろいろ入ってるでしょう。
var req = http.request(options,
  function(res) {
    // バイナリで受け取る。
    res.setEncoding('binary');
    // Bufferの配列。
    var data = [];
    res.on('data', function (chunk) {
      // chunkをBufferに変換。
      // ちなみに'binary'指定は非推奨らしい。代わりに何使えばいいんだろう?
      data.push( new Buffer( chunk, 'binary' ) );
    });
    res.on('end', function () {
      // dataにはBufferがいくつかあるので、concatで結合可能。
      var img = Buffer.concat( data );
    });
  });
req.end();

こんな感じで、imgには無事バイナリデータ(Buffer)が格納されました。

もうnode.jsでバイナリいじりたくないよぉ。