本文介绍了如何根据第一个块中的数据将流重定向到其他流?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用 Busboy 以多部分形式处理文件.简化版的流程是这样的:

I'm processing files in a multipart form with Busboy. The process in simplified version looks like this:

file.pipe(filePeeker).pipe(gzip).pipe(encrypt).pipe(uploadToS3)

file.pipe(filePeeker).pipe(gzip).pipe(encrypt).pipe(uploadToS3)

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

filePeeker is a through-stream (built with trough2). This duplex stream does the following:

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

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

After the first four bytes in the first chunk I know if the file is a zip file. If this is the case I want to redirect the file to a completely different stream. In the new stream the compressed files will be unZipped and then handled separately with the same concept as the original file.

我怎样才能做到这一点?

How can I accomplish this?

原始流程:file.pipe(filePeeker).if(!zipFile).pipe(gZip).pipe(encrypt).pipe(uploadToS3)

OriginalProcess:file.pipe(filePeeker).if(!zipFile).pipe(gZip).pipe(encrypt).pipe(uploadToS3)

解压过程file.pipe(filePeeker).if(zipFile).pipe(streamUnzip).pipeEachNewFile(originalProcess).

UnZip-processfile.pipe(filePeeker).if(zipFile).pipe(streamUnzip).pipeEachNewFile(originalProcess).

谢谢//迈克尔

推荐答案

有一些模块可以解决这个问题,但基本的想法是推送到另一个可读流并在您的条件中尽早返回.为它编写一个转换流.

There are modules for that, but the basic idea would be to push to another readable stream and return early in your conditional. Write a Transform stream for it.

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

这篇关于如何根据第一个块中的数据将流重定向到其他流?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-25 06:13