web-dev-qa-db-ja.com

URLから画像をバッファとして取得

画像データをバッファとして取得しようと数時間費やしました。検索結果から「リクエスト」モジュールを使用するようになりました。他の提案では、ノードv 6.11に依存しているため、使用できないノードの上位バージョンで他のモジュールを使用することになります。これまでのところ。

これが私の試練です:

request(imageURL).pipe(fs.createWriteStream('downloaded-img-
1.jpg')).on('close', function () {
        console.log('ok');
});

request(imageURL, function (err, message, response) {
fs.writeFile('downloaded-img-2.jpg', response, 'binary', function (err) {
    console.log('File saved.');
});

fs.writeFile('downloaded-img-3.jpg', chunks, 'binary', function (err) {
        console.log('File saved.');
})

resolve(response);
})
.on('data', function (chunk) {
    chunks.Push(chunk);
})
.on('response', function (response) {

});
});

「downloaded-img-1.jpg」は正しくダウンロードされますが、ファイルをディスクに保存してからストリームとして読み取ることは避けなければなりません。これはPRD環境の制約です。したがって、次のオプションは、「downloaded-img-2.jpg」と「downloaded-img-3.jpg」で示されているように、「応答」または手作りの「チャンク」を待つことによって、画像データを使用することです。問題は、これら2つの画像が常に破損していることです。理由はわかりませんか?

そのすべての背後にあるポイントは何ですか? URLの背後にある画像をZipファイルに追加しようとしていますが、使用するZipライブラリ(js-Zip)は入力としてバッファーを受け入れます。 「チャンク」または「応答」が正しく取得されない理由はありますか?

5
Ihab

以下のコードをNode 6.9.2でテストしました。イメージをバッファーとしてダウンロードします。また、バッファーをファイルに書き込みます(すべてをテストするだけでOKです!)。 bodyオブジェクトは、画像データを含むバッファです。

"use strict";

var request = require('request');
var fs = require('fs');

var options = {
    url: "https://upload.wikimedia.org/wikipedia/commons/thumb/5/52/Hubble2005-01-barred-spiral-galaxy-NGC1300.jpg/1920px-Hubble2005-01-barred-spiral-galaxy-NGC1300.jpg",
    method: "get",
    encoding: null
};

console.log('Requesting image..');
request(options, function (error, response, body) {

    if (error) {
        console.error('error:', error);
    } else {
        console.log('Response: StatusCode:', response && response.statusCode);
        console.log('Response: Body: Length: %d. Is buffer: %s', body.length, (body instanceof Buffer));
        fs.writeFileSync('test.jpg', body);
    }
});
1
Terry Lennox