如何根据第一个块中的数据将流重定向到其他流?

时间:2015-10-20 08:23:40

标签: node.js stream

我正在使用Busboy处理多部分表单中的文件。简化版的过程如下所示:

file.pipe(filePeeker).pipe(gzip的).pipe(加密).pipe(uploadToS3)

filePeeker是一个直通(使用 trough2 构建)。此双工流执行以下操作:

  • 通过查看第一个块中的第一个字节来识别文件类型
  • 累积文件大小
  • 计算MD5哈希

在第一个块中的前四个字节之后,我知道该文件是否是zip文件。如果是这种情况,我想将文件重定向到完全不同的流。在新流中,压缩文件将被解压缩,然后使用与原始文件相同的概念单独处理。

我该如何做到这一点?

OriginalProcess: file.pipe(filePeeker)。如果(!zip文件).pipe(GZIP).pipe(加密).pipe(uploadToS3)

解压缩处理 file.pipe(filePeeker)。如果(zip文件).pipe(streamUnzip).pipeEachNewFile(originalProcess)。

由于 //迈克尔

1 个答案:

答案 0 :(得分:1)

有一些模块,但基本的想法是推送到另一个可读的流并在条件的早期返回。为它写一个转换流。

var Transform = require("stream").Transform;
var util = require("util");
var Readable = require('stream').Readable;

var rs = new Readable;
rs.pipe(unzip());

function BranchStream () {
    Transform.call(this);
}
util.inherits(BranchStream, Transform);

BranchStream.prototype._transform = function (chunk, encoding, done) {
     if (isZip(chunk)) {
         rs.push(chunk);
         return done()
     }
     this.push(doSomethingElseTo(chunk))
     return done()
}