2014-11-04 11 views
7

Desidero salvare un'immagine con node.js e request library. Finora ho questo semplice codice:Impossibile salvare un'immagine remota con node.js e richiesta

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(){}); 
}); 

Ma non funziona. L'immagine arriva sempre corrotta. Presumo che si tratta di un errore di codifica, ma non riesco a capire come risolvere questo problema.

risposta

20
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) {}); 
}); 
+1

Funziona, grazie! –

3
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')); 
+0

Ho visto esempi nella pagina di richiesta utilizzando la variante di streaming. Mentre questo funziona generalmente ho bisogno della variante che sta usando il callback perché ho qualche altra logica in esecuzione che decide se l'immagine verrà salvata o meno. Ma grazie per la tua risposta! –

1

Ecco come ho fatto usando stream e pipe, (stavo usando express ma non si può avere bisogno che)

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")}) 
}) 

quando ho eseguito utilizzando node server.js e ha colpito l'url localhost:3000/image, scaricherà e salverà il file in porcupine.png nella directory di base.

+0

Questo è un sacco di cose che non ho chiesto, ma sono sicuro che questo sarà utile per qualcuno. Grazie per la condivisione! –

Problemi correlati