Nodejs zlib 库,怎么压缩多个 Buffer

发布于 1周前 作者 wuwangju 来自 nodejs/Nestjs

Nodejs zlib 库,怎么压缩多个 Buffer

因为要做阿里云 oss 文件批量压缩下载 目前 OSS 文件已经下载为 Buffer 数据

但是目前好像没有找到方法能 gzip 压缩多个文件

const result = data['source-files'].map(item=>client.get(item))
Promise.all(result).then(res=>{
    resp.setHeader('content-type', 'gzip');
    resp.send(Buffer.from(zlib.gzipSync(res[0].content)))
},err=>{
    resp.send('fail');
}).catch(err=>{
    resp.send('fail');
})

另外,下载下来的 GZIP 里的文件名也没有找到方法可以定义,求问有没有老哥有这方面经验的


7 回复

gzip 本来就不是压缩多个文件用的
gzip 不是 zip 文件格式
只能压缩单个文件或者 Buffer/流

如果要压缩多个文件 一般先 tarball 打包 然后再 gzip

如果不想按照 tar 来打包 你也可以自己打包多个文件
比如直接把所有 buffer 拼接在一起再 gzip 然后存一下文件名和 offset 就好


好的吧,我试试其他的库

建议一步到位用 tar+xz 或者 tar+zstd

如果是给用户下载用的 建议用 zip 或者 tar+gzip (tgz)
如果面向普通或者企业客户用 zip 比较好
如果面向开发者或者工程师 tgz 比较好

如果是自己内部用的 要压缩率不在乎时间用 tar+xz 要速度不在乎压缩率用 tar+zstd
如果是给客户 还是 zip 或者 tgz 比较好 你看 gitlab/github 都提供这样的

目前用的是 adm-zip 压缩的 ZIP 包,面向客户的比较友好一点哈哈

在 Node.js 中,你可以使用 zlib 库来压缩多个 Buffer。zlib 提供了多种压缩和解压缩方法,比如 gzipdeflatedeflateRaw 等。为了压缩多个 Buffer,你可以将它们合并成一个,然后再进行压缩。以下是一个示例代码,展示了如何合并多个 Buffer 并使用 zlib.deflate 方法进行压缩:

const zlib = require('zlib');

// 示例 Buffer 数组
const buffers = [
  Buffer.from('Hello, '),
  Buffer.from('world!'),
  Buffer.from(' This is a test.')
];

// 合并多个 Buffer
const mergedBuffer = Buffer.concat(buffers);

// 使用 zlib.deflate 压缩 Buffer
zlib.deflate(mergedBuffer, (err, result) => {
  if (err) {
    console.error('压缩失败:', err);
    return;
  }
  console.log('压缩后的 Buffer:', result);
  
  // 如果需要,可以将压缩后的 Buffer 转换为字符串(例如 Base64 编码)
  const compressedString = result.toString('base64');
  console.log('压缩后的 Base64 字符串:', compressedString);
});

在这个示例中,我们首先使用 Buffer.concat 方法将多个 Buffer 合并成一个。然后,我们使用 zlib.deflate 方法对合并后的 Buffer 进行压缩。压缩完成后,你可以将结果存储或传输。如果需要,你还可以将压缩后的 Buffer 转换为字符串(例如使用 Base64 编码),以便更容易地存储或传输。

希望这个示例能帮助你理解如何在 Node.js 中使用 zlib 库压缩多个 Buffer。

回到顶部