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'))
    })
});

有时它有效,但有时它不起作用 - 我的猜测是文件在读取时没有完全写入。(但是不应该触发“结束”事件?!如您所见,我想下载一堆文件并执行此操作。您有什么建议如何解决这个问题吗?也许这不是最好的解决这个问题的方法...

4

2 回答 2

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'));   
});
于 2013-04-01T17:36:01.347 回答
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'))
        });
    })
});
于 2013-04-01T17:33:45.670 回答