web-dev-qa-db-ja.com

node.jsとリクエストでリモートイメージを保存できません

Node.jsと リクエストライブラリ で画像を保存したい。これまでのところ、私はこの単純なコードを持っています:

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

request('http://upload.wikimedia.org/wikipedia/commons/8/8c/JPEG_example_JPG_RIP_025.jpg', function(error, response, body)
{
    // further logic that decides
    // whether or not the image will be saved

    fs.writeFile('downloaded.jpg', body, function(){});
});

しかし、それは機能しません。画像は常に破損して到着します。エンコーディングエラーだと思いますが、これを修正する方法がわかりません。

11
user659025
var request = require('request'), 
    fs      = require('fs'),
    url     = 'http://upload.wikimedia.org/wikipedia/commons/8/8c/JPEG_example_JPG_RIP_025.jpg';

request(url, {encoding: 'binary'}, function(error, response, body) {
  fs.writeFile('downloaded.jpg', body, 'binary', function (err) {});
});
29
Alexander T.
var fs = require('fs'),
    request = require('request'),
    url='http://upload.wikimedia.org/wikipedia/commons/8/8c/JPEG_example_JPG_RIP_025.jpg';

request(url).pipe(fs.createWriteStream('downloaded.jpg'));
5
kaxi1993

streampipeを使用してこれを行った方法は次のとおりです(私はexpressを使用していましたが、それは必要ないかもしれません)

var express = require('express');
var app = express();
var filesystem = require('fs');
var https = require('https');


var download = function(url, dest, cb) {
   var file = filesystem.createWriteStream(dest);
   var request = https.get(url, function(httpResponse) {
    httpResponse.pipe(file);
    file.on('finish', function() {
      console.log("piping to file finished")
      file.close(cb);  // close() is async, call cb after close completes.
    });
   }).on('error', function(err) { // Handle errors
    filesystem.unlink(dest); // Delete the file async. (But we don't check the result)
    if (cb) cb(err.message);
   });
};

app.get('/image', (req, res) => {
 download('https://lastfm-img2.akamaized.net/i/u/64s/15cc734fb0e045e3baac02674d2092d6.png',
          'porcupine.png', 
           () => {console.log("downloaded to porcupine.png")})
})

node server.jsを使用して実行し、URL localhost:3000/imageを押すと、ファイルがダウンロードされ、ベースディレクトリのporcupine.pngに保存されます。

2
prayagupd