Запись образа на локальный сервер
обновление
принятый ответ был хорош в прошлом году, но сегодня я бы использовал пакет, который все остальные используют: https://github.com/mikeal/request
Оригинал
Я пытаюсь захватить логотип google и сохранить его на моем сервере с узлом.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's saved!');
});
});
});
Как я могу заставить это работать?
4 ответа:
несколько вещей, происходящих здесь:
- Я предполагаю, что вам требуется fs / http, и установите переменную dir:)
- google.com перенаправляет на www.google.com, так что вы сохраняете тело ответа перенаправления, а не изображение
- ответ передается. это означает, что событие "данные" срабатывает много раз, а не один раз. вы должны сохранить и объединить все куски вместе, чтобы получить полное тело ответа
- так как вы получаете двоичные данные, вы должны установить кодировку соответственно на response и 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.') }) }) })
этот поток старый, но я хотел сделать то же самое с 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!"); }); });
Я предлагаю вам использовать http-запрос, Так что даже редиректы обрабатываются.
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); } });
Как насчет этого?
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.') }) })