4

我正在尝试打开一个 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 知道以便在标题中发送它?

我不喜欢 writehead 不在回调中,我该怎么办?

谢谢你。

4

3 回答 3

7

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

var file = fs.createReadStream(image);
res.writeHead(200, {"Content-Type" : "image/png"});
file.pipe(res);
于 2012-11-21T04:19:37.943 回答
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);
于 2012-11-21T04:24:48.540 回答
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);
        };
    });
于 2012-11-21T19:33:56.157 回答