验证node.js中上载文件的mime类型
我使用node和express处理文件上传,并使用multiparty/busboy和request将它们直接流式传输到转换服务 在将流发送到相应的提供程序之前,是否有方法验证流是否具有某些文件类型?我试着从第一个块中提取MIME类型,效果很好。我想知道以下工作流程是否能以某种方式工作:验证node.js中上载文件的mime类型,node.js,express,stream,mime-types,multipartform-data,Node.js,Express,Stream,Mime Types,Multipartform Data,我使用node和express处理文件上传,并使用multiparty/busboy和request将它们直接流式传输到转换服务 在将流发送到相应的提供程序之前,是否有方法验证流是否具有某些文件类型?我试着从第一个块中提取MIME类型,效果很好。我想知道以下工作流程是否能以某种方式工作: 缓冲文件上载流并检查Mime类型的传入数据 当检查了前几个块并且mime类型正确时,将缓冲区清空到请求流中 当mime类型不正确时,发送错误消息并返回 我试图让它工作,但我似乎有一些流兼容性问题(节点0.8
- 缓冲文件上载流并检查Mime类型的传入数据
- 当检查了前几个块并且mime类型正确时,将缓冲区清空到请求流中
- 当mime类型不正确时,发送错误消息并返回
除了检查客户端请求的
内容类型
头之外,我不知道有什么更好、更聪明的方法来检查MIME类型
您可以使用。在本例中,转换流缓冲一些任意数量的数据,然后将其发送到MIME检查库。如果一切正常,它会重新发送数据。随后的块将按原样发出
编辑:为了更清楚您在节点0.8和0.10流之间遇到的不兼容,当您定义一个流并附加一个
。在('data')
侦听器上,它将切换到流模式(也称为0.8流),这意味着即使目的地没有侦听,它也会发出数据。如果您启动对Magic.detect()
的异步请求,可能会发生这种情况:即使您侦听数据,数据仍然会流动。这是一个非常好的答案!您完全正确,请求本身支持新的streams API。但不幸的是节点表单数据(由请求使用)并没有:无论如何,这应该可以帮助我重新站起来!非常感谢。对不起,上面的代码不适合我。在大括号和“this”上下文方面做了一些更改之后,我最终编写了这段代码(只是为了尝试):我不得不引入mimefund属性,因为上面的代码从未到达最后一个“else”。但是我的解决方案留下了一些损坏的文件(它们缺少一些字节)。事实上,我最初编写的代码没有经过测试。我用一个工作示例(这里有一个用法示例)更新了我的帖子,你刚刚让我开心了一天。再次感谢!
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();
});
}
};
// Usage example
var fs = require('fs');
fs.createReadStream('input.txt').pipe(mimeChecker).pipe(fs.createWriteStream('output.txt'));