2013-04-01 3 views
1

Я хотел бы загрузить файл, записать его во временный файл, прочитать его и дать буферу readFileSync функцию. Я попытался это:Загрузите файл, сохраните его и прочитайте снова -> Ошибка

var file = fs.createWriteStream("temp.pdf") 
var request = http.get(linkArray[1], function(response) { 
    response.on('data', function(data){ 
     file.write(data) 
    }).on('end', function(){ 
     postData(fs.readFileSync('temp.pdf')) 
    }) 
}); 

Иногда это работает, но иногда это не так - я думаю, что файл не записывается полностью, когда он будет читать. (Но чем не должно быть упущено событие «end»?! Как вы можете видеть, я хотел бы загрузить кучу файлов и сделать это. У вас есть какие-либо советы, как это решить? Возможно, это не лучший способ решить эту проблему ...

ответ

5

вы не должны связать потоки с on('data' вы должны использовать трубу. Труба соединит потоки данных событий для записи и конечных событий с концами.

var file = fs.createWriteStream("temp.pdf"); 
var request = http.get(linkArray[1], function(response) { 
    response.pipe(file).on('close', function(){ 
     postData(fs.readFileSync('temp.pdf')); 
    }); 
}); 

также вы должны использовать https://github.com/mikeal/request

var request = require('request'); 

request.get(linkArray[i], function (err, response, body) { 
    postData(body); 
}); 

или

var request = require('request'); 
var file = fs.createWriteStream("temp.pdf"); 

request.get(linkArray[i]).pipe(file).on('close', function() { 
    postData(fs.readFileSync('temp.pdf')); 
}); 
+0

«конец» события не запускается -> функция postData не вызывается, но файл написан – Knob1

+0

ahh, да, извините, так как это доступный для записи, он закрыт е. (pipe возвращает поток, записываемый в) – generalhenry

+0

Хм, все эти версии приводят к той же ситуации -> иногда это работает, иногда нет. – Knob1

0

Вам нужно позвонить file.end(); в верхней части .on('end', ...) обработчика. метод сам end() асинхронный, хотя, так что вы хотите, чтобы прочитать файл, как только это полная. например,

var file = fs.createWriteStream("temp.pdf") 
var request = http.get(linkArray[1], function(response) { 
    response.on('data', function(data){ 
     file.write(data) 
    }).on('end', function(){ 
     file.end(function() { 
      postData(fs.readFileSync('temp.pdf')) 
     }); 
    }) 
}); 
+0

Это прекрасно работает, но если я его окружают с для или во время цикла (чтобы пройти через массив ссылок ...) запрос не отправляется снова - любая идея о том, как отправлять несколько запросов http.get – Knob1

Смежные вопросы