如何使用yazl压缩缓冲区?

时间:2019-02-13 20:11:37

标签: javascript node.js buffer

如何通过yazl压缩/解压缩缓冲区? https://www.npmjs.com/package/yazl

我不想创建/保存一个zip文件,而只是压缩一个缓冲区并将其转发到另一个服务。任何示例代码都会有帮助

var yazl = require("yazl");

var buf = fs.readFileSync(__dirname + '/testArchive.txt');
var zipfile = new yazl.ZipFile();
zipfile.addBuffer(buf, "TEMPENTRY");
zipfile.end();

那么这时已存档吗? 那我该如何使用yauzl来增加那个缓冲区?

1 个答案:

答案 0 :(得分:1)

这种功能应该会有所帮助,手动检索流的数据包,然后将它们串联为一个Buffer

function stream2buffer(readableStream) {
  return new Promise((resolve, reject) => {
    const chunks = [];
    readableStream.on('data', (chunk) => {
      chunks.push(chunk);
    }).on('end', () => {
      resolve(Buffer.concat(chunks));
    }).on('error', (err) => {
      reject(err);
    });
  });
}

然后,您可以在yazl.ZipFile.outputStream以及yauzl.ZipFile.openReadStream的回调提供的可读流的另一端使用它。

编辑

我的意思更像是在yazl的{​​{1}}上使用此功能,而不是在要压缩的源文件上使用。像这样:

outputStream

与解压缩类似:

function zipper(mapping) { // mapping is expected to be a Map here
  const handler = new yazl.ZipFile(); // yazl = require('yazl');
  for (mapItem of mapping) {
    if (typeof mapItem[1] === 'string' || mapItem[1] instanceof String) {
      handler.addFile(mapItem[1], mapItem[0]);
    } else if (mapItem[1] instanceof Buffer) {
      handler.addBuffer(mapItem[1], mapItem[0]);
    } else if (mapItem[1] instanceof stream.Readable) { // stream = require('stream');
      handler.addReadStream(mapItem[1], mapItem[0]);
    } else throw new Error('unsupported type');
  }
  handler.end();
  return stream2buffer(handler.outputStream);
}