Ecrire une image sur un serveur local

mise à Jour

la réponse acceptée était bonne pour l'année dernière mais aujourd'hui j'utiliserais le paquet tout le monde utilise: https://github.com/mikeal/request


Original

j'essaie de récupérer le logo de google et de le sauvegarder sur mon serveur avec node.js.

C'est ce que j'ai en ce moment et ça ne marche pas:

        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's saved!');
                });
            });
        });

Comment faire pour que ça marche?

53
demandé sur serv-inc 2011-03-14 06:38:31

4 réponses

quelques événements qui se produisent ici:

  1. je suppose que vous aviez besoin de fs / http, et définir la variable dir:)
  2. google.com redirige vers www.google.com, donc vous sauvegardez le corps de la réponse de redirection, pas l'image
  3. la réponse est diffusée en continu. cela signifie que les 'données' événement se déclenche plusieurs fois, pas une seule fois. vous devez sauvegarder et joindre tous les morceaux ensemble pour obtenir le corps de réponse complète
  4. puisque vous êtes obtenir des données binaires, vous devez définir l'encodage en conséquence sur la réponse et writeFile (par défaut est utf8)

cela devrait marcher:

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.')
        })
    })

})
77
répondu Ricardo Tomasi 2011-10-07 22:43:26

ce fil est vieux mais je voulais faire la même chose avec le https://github.com/mikeal/request paquet .

voici un exemple pratique

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!");
  }); 
});
33
répondu m4tm4t 2013-12-10 09:30:58

je vous suggère d'utiliser requête http , pour que même les redirections soient gérées.

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);
    }
});
26
répondu Drasill 2014-11-26 13:06:05

Qu'en est-il?

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.')
    })

})
5
répondu yuqin 2014-11-05 03:07:39