2015-10-20 48 views
0

我正在用Busboy处理多部分形式的文件。在简化版本的过程是这样的:如何根据第一块中的数据将流重定向到其他流?

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

filePeeker是通过流(用trough2建)。这间复式流执行以下操作:

  • 在第一区块中
  • 看着第一字节累积文件大小
  • 计算MD5哈希

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

我该如何做到这一点?

OriginalProcess: file.pipe(filePeeker)。如果.pipe(GZIP).pipe(加密).pipe(uploadToS3)

解压过程 file.pipe(filePeeker)。如果(zip文件!) (zip文件).pipe(streamUnzip).pipeEachNewFile(originalProcess)。

感谢 //迈克尔

回答

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() 
} 
+0

谢谢。在尝试此操作之前,我必须先阅读更多关于流的信息。我想知道为什么我不能这样做,从我的流内:if(isZip)fileStream.unshift(chunk); fileStream.push(''); fileStream.unpipe(); fileStream.pipe(unzip) – Michael

+0

目前我想这是唯一的方法。模块只是为你抽象这个行为。 此外,我猜API将来不会有这样的糖。 – eljefedelrodeodeljefe

+0

在阅读本文时,请注意,这是Node的一个更高级的主题。很少有人甚至了解Streams的来源。但这没关系,因为当你采用这种编程风格时,你永远不会想回去。 – eljefedelrodeodeljefe

相关问题