除了检查客户端请求的
Content-Type
标头之外,我不知道有更好、更聪明的方法来检查 MIME 类型。
您可以使用
转换流 来实现上述解决方案。在此示例中,转换流缓冲一些任意数量的数据,然后将其发送到您的 MIME 检查库中。如果一切正常,它将重新发出数据。随后的块将被原样发出。
var stream = require('readable-stream');
var mmm = require('mmmagic');
var mimeChecker = new stream.Transform();
mimeChecker.data = [];
mimeChecker.mimeFound = false;
mimeChecker._transform = function (chunk, encoding, done) {
var self = this;
if (self.mimeFound) {
self.push(chunk);
return done();
}
self.data.push(chunk);
if (self.data.length < 10) {
return done();
}
else if (self.data.length === 10) {
var buffered = Buffer.concat(this.data);
new mmm.Magic(mmm.MAGIC_MIME_TYPE).detect(buffered, function(err, result) {
if (err) return self.emit('error', err);
if (result !== 'text/plain') return self.emit('error', new Error('Wrong MIME'));
self.data.map(self.push.bind(self));
self.mimeFound = true;
return done();
});
}
};
你可以将这个转换流导入到任何其他流中,比如请求流(顺便说一下,请求流完全支持Node 0.10流)。
var fs = require('fs');
fs.createReadStream('input.txt').pipe(mimeChecker).pipe(fs.createWriteStream('output.txt'));
编辑:为了更清楚地解释您在Node 0.8和0.10流之间遇到的不兼容性,当您定义一个流并将.on('data')
监听器附加到它上面时,它将切换到流模式(又称0.8流),这意味着即使目标没有侦听,它仍会发出数据。如果您启动异步请求到Magic.detect()
,这就是可能发生的情况:即使您监听它,数据仍然会流动。