如何将从gunzip流修改的数据管道传输到gzip流?

问题描述

我需要通过http请求触发一个过程,在该过程中,我从S3下载一些数据,对数据进行压缩,修改流,对它进行gzip,然后发送到S3中的另一个存储桶。

到目前为止,我能够:

  1. 下载
  2. Gunzip
  3. 修改(过滤)数据
  4. 返回数据

或者:

  1. 下载
  2. Gunzip
  3. Gzip
  4. 上传未修改的数据并检索对象的url

我的第一个尝试包括使用gunzip流中的 on('data')事件来修改数据;然后当引发“结束”事件时,我可以将其返回给发出请求的浏览器。

var accumulator = [];

gunzip.on('data',chunk=>{
    var lines = chunk.toString('utf-8').split(\n);
    lines.forEach(line=>{
       if(shouldBeFiltered(line)){
         accumulator.push(line);
       }
    })
})

gunzip.on('end',()=>{
    res.send(accumulator);
})

getS3.pipe(gunzip) 

如果我不返回结果(res.send),而是尝试将gunzip传递给gzip,则忽略过滤器。之所以有意义,是因为我有一个 accumulator 数组,在引发结束事件时我返回了(在前面的情况下)。

然后,在进行一些挖掘之后,我发现了一个参考文献,建议应将数据推入,然后尝试了以下操作,但这是行不通的:

gunzip.on('data',chunk=>{
    var lines = chunk.toString('utf-8').split(\n);
    lines.forEach(line=>{
       if(shouldBeFiltered(line)){
         gunzip.push(line);
       }
    })
})

// the end event no longer mattered
// gunzip.on('end',()=>{
//    res.send(accumulator);
// })

getS3.pipe(gunzip).pipe(gzip).pipe(putS3(putS3param.Key,putS3param.Bucket)); 

然后我尝试创建一个转换流(在尝试该概念时,这非常简化),但是随后出现内部错误:

const stream = require('stream');
const Transform = stream.Transform;

function filter(pipeline) {
    var the_filter = new Transform({
        transform(chunk,encoding,next) {
            console.log();
            chunk += Buffer('Modified','utf-8');
            this.push(chunk);
            next();
        }
    });
    pipeline.pipe(the_filter);
}

除了创建文件并将其gzip压缩并上传外,我没有其他想法。

感谢您的帮助!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)