任意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でバイナリいじりたくないよぉ。