我想下载一个文件,将其写入临时文件,读取它并将readFileSync Buffer提供给一个函数。我试过这个:
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'))
})
});
有时它可以工作,但有时它不起作用 - 我的猜测是文件在读取时没有完全写入。 (但不应该解雇'结束'事件?! 如您所见,我想下载一堆文件并执行此操作。你有任何建议如何解决这个问题?也许这不是解决这个问题的最佳方法......
答案 0 :(得分:5)
您不应该使用管道on('data'
来链接流。 Pipe将流数据事件链接到写入和结束事件到结束。
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'));
});
答案 1 :(得分: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'))
});
})
});