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