2015-10-20 47 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

相關問題