2014-11-04 18 views
7

Chcę zapisać obraz przy użyciu pliku node.js i request library. Do tej pory mam ten prosty kod:Nie można zapisać zdalnego obrazu za pomocą pliku node.js i żądania

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

Ale to nie działa. Obraz zawsze przychodzi uszkodzony. Zakładam, że to błąd kodowania, ale nie wiem, jak to naprawić.

Odpowiedz

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

To działa, dziękuję! –

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

Widziałem przykłady na stronie żądania przy użyciu wariantu przesyłania strumieniowego. Chociaż to na ogół działa, potrzebuję wariantu, który używa wywołania zwrotnego, ponieważ mam trochę dalszej pracy logicznej, która decyduje o tym, czy obraz zostanie zapisany. Ale za odpowiedź! –

1

Oto jak zrobiłem to za pomocą stream i pipe (używałem express ale może nie trzeba, że)

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

Kiedy uruchomić za pomocą node server.js i uderzył url localhost:3000/image, pobierze i zapisze plik do porcupine.png w katalogu podstawowym.

+0

To wiele rzeczy, o które nie prosiłem, ale jestem pewien, że to będzie pomocne dla kogoś. Dzięki za udostępnienie! –

Powiązane problemy