createReadStream发送文件http

时间:2012-11-21 03:33:17

标签: file node.js stream

我正在尝试打开一个img文件并通过http发送它。我已经读过,做到这一点的最佳方法是creatReadStream,因为它是异步的,性能更好。

这是我的代码:

var file = fs.createReadStream(image);

    file.on("error", function(err){
        ...
    });

    res.writeHead(200, {"Content-Type" : "image/png"});

    file.on("data", function(data) {
        res.write(data);
    })

    file.on("end", function() {
        res.end();
    })

我如何知道文件大小让res知道才能在标题中发送?

我不喜欢没有回写的写头,我该怎么办?

谢谢。

3 个答案:

答案 0 :(得分:5)

res.writeHead()调用位于正确的位置,但事件侦听器可以替换为file.pipe(res);,因为您只将数据从读取流转发到res的写入流。此外,HTTP响应代码202似乎不合适,为什么不使用200

var file = fs.createReadStream(image);
res.writeHead(200, {"Content-Type" : "image/png"});
file.pipe(res);

答案 1 :(得分:5)

var stat = fs.statSync('path/to/imagefile');
response.writeHead(200, {
  'Content-Type' : 'image/png',
  'Content-Length': stat.size
});
fs.createReadStream('path/to/imagefile').pipe(response);

答案 2 :(得分:1)

@wayne非常感谢您的回答,但是异步使用stat会不会更好?

var stat = fs.stat(image, function(err,stats) {
        if (err) {
            req_error(res,err);
        } else {
            res.writeHead(200, {
            'Content-Type' : 'image/png',
            'Content-Length': stats.size
            });

            var file = fs.createReadStream(image);
            file.pipe(res);
        };
    });