验证node.js中上载文件的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

我使用node和express处理文件上传,并使用multiparty/busboy和request将它们直接流式传输到转换服务

在将流发送到相应的提供程序之前,是否有方法验证流是否具有某些文件类型?我试着从第一个块中提取MIME类型,效果很好。我想知道以下工作流程是否能以某种方式工作:

  • 缓冲文件上载流并检查Mime类型的传入数据
  • 当检查了前几个块并且mime类型正确时,将缓冲区清空到请求流中
  • 当mime类型不正确时,发送错误消息并返回
我试图让它工作,但我似乎有一些流兼容性问题(节点0.8.x与节点0.10.x流,请求库不支持)

是否有解决此问题的最佳实践?我是不是看错了

编辑:多亏了我,我想出了以下代码:


除了检查客户端请求的
内容类型
头之外,我不知道有什么更好、更聪明的方法来检查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'));