2014-11-04 10 views
7

isteğinde bulunmuyor node.js ve request library ile bir görüntü kaydetmek istiyorum. Şimdiye kadar bu basit kodum var:Uzak bir resmi node.js ile kaydedemiyor ve

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

Ama işe yaramıyor. Görüntü her zaman bozuklaşır. Bunun bir kodlama hatası olduğunu varsayardım, ancak bunu nasıl düzelteceğimi anlayamıyorum. Ben, stream ve pipe kullanarak nasıl yaptığını

cevap

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

Bu işler, teşekkür ederim! –

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

Akış varyantını kullanarak istek sayfasında örnekler gördüm. Bu genellikle işe yarıyorken, geri çekmeyi kullanan varyanta ihtiyacım var çünkü görüntünün kaydedilip kaydedilmeyeceğine karar veren başka bir mantıksal çalıştırma var. Ama cevabın için teşekkürler! –

1

İşte (ı express kullanıyordum ama bunu gerekmeyebilir)

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

Ben node server.js kullanarak ve url localhost:3000/image vurmak çalıştırmak, Temel dizinde dosyayı porcupine.png'a indirip kaydedecektir.

+0

Bu benim sormadığım pek çok şeydi, ama eminim ki bu birileri için yararlı olacaktır. Paylaşım için teşekkürler! –