Подтвердить что ты не робот

Запись изображения на локальный сервер

Обновление

Принятый ответ был хорош для прошлого года, но сегодня я бы использовал пакет, который все остальные используют: https://github.com/mikeal/request


Оригинал

Я пытаюсь захватить логотип Google и сохранить его на своем сервере с помощью node.js.

Это то, что у меня есть прямо сейчас и не работает:

        var options = {
            host: 'google.com',
            port: 80,
            path: '/images/logos/ps_logo2.png'
        };

        var request = http.get(options);

        request.on('response', function (res) {
            res.on('data', function (chunk) {
                fs.writeFile(dir+'image.png', chunk, function (err) {
                    if (err) throw err;
                    console.log('It\ saved!');
                });
            });
        });

Как я могу заставить это работать?

4b9b3361

Ответ 1

Несколько вещей, происходящих здесь:

  • Предполагаю, что вам нужен fs/http, и установите переменную dir:)
  • google.com перенаправляет на www.google.com, поэтому вы сохраняете тело ответа на перенаправление, а не изображение
  • ответ передается. это означает, что событие "данные" срабатывает много раз, а не один раз. вам нужно сохранить и объединить все куски вместе, чтобы получить полное тело ответа.
  • так как вы получаете двоичные данные, вам необходимо установить кодировку соответственно в ответ и writeFile (по умолчанию - utf8)

Это должно работать:

var http = require('http')
  , fs = require('fs')
  , options

options = {
    host: 'www.google.com'
  , port: 80
  , path: '/images/logos/ps_logo2.png'
}

var request = http.get(options, function(res){
    var imagedata = ''
    res.setEncoding('binary')

    res.on('data', function(chunk){
        imagedata += chunk
    })

    res.on('end', function(){
        fs.writeFile('logo.png', imagedata, 'binary', function(err){
            if (err) throw err
            console.log('File saved.')
        })
    })

})

Ответ 2

Этот поток старый, но я хотел сделать то же самое с пакетом https://github.com/mikeal/request.

Вот рабочий пример

var fs      = require('fs');
var request = require('request');
// Or with cookies
// var request = require('request').defaults({jar: true});

request.get({url: 'https://someurl/somefile.torrent', encoding: 'binary'}, function (err, response, body) {
  fs.writeFile("/tmp/test.torrent", body, 'binary', function(err) {
    if(err)
      console.log(err);
    else
      console.log("The file was saved!");
  }); 
});

Ответ 3

Я предлагаю вам использовать http-request, чтобы можно было управлять даже перенаправлением.

var http = require('http-request');
var options = {url: 'http://localhost/foo.pdf'};
http.get(options, '/path/to/foo.pdf', function (error, result) {
    if (error) {
        console.error(error);
    } else {
        console.log('File downloaded at: ' + result.file);
    }
});

Ответ 4

Как насчет этого?

var http = require('http'), 
fs = require('fs'), 
options;

options = {
    host: 'www.google.com' , 
    port: 80,
    path: '/images/logos/ps_logo2.png'
}

var request = http.get(options, function(res){

//var imagedata = ''
//res.setEncoding('binary')

var chunks = [];

res.on('data', function(chunk){

    //imagedata += chunk
    chunks.push(chunk)

})

res.on('end', function(){

    //fs.writeFile('logo.png', imagedata, 'binary', function(err){

    var buffer = Buffer.concat(chunks)
    fs.writeFile('logo.png', buffer, function(err){
        if (err) throw err
        console.log('File saved.')
    })

})