在 Node.js 中处理 ZIP 压缩包:archiver 和 adm-zip 库

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

在 Node.js 中处理 ZIP 压缩包:archiver 和 adm-zip 库



在现代 Node.js 网页开发中,经常需要将文件打包成压缩包或从中提取数据。无论是备份、通过单个压缩包下载多个文件,还是处理用户数据,ZIP 格式的使用仍然非常广泛。Node.js 有多个流行的库,本文将介绍其中最强大且便捷的两个:archiver(用于创建压缩包)和 adm-zip(用于读取和操作压缩包)。



为什么需要用于处理 ZIP 的库?

Node.js 默认不提供处理压缩包的内置工具。虽然存在用于压缩单个流的 zlib 模块,但要创建包含多个文件和文件夹的完整 ZIP 文件,则需要专门的解决方案。archiver 和 adm-zip 库通过提供简单的 API 和高性能来解决这些问题。



安装库

这两个库都可以通过 npm 安装。在终端中执行:

npm install archiver adm-zip


archiver 库:创建 ZIP 压缩包

archiver 是一个用于创建多种格式(ZIP、TAR、GZIP)压缩包的库。它基于流(streams)工作,能够高效处理大量数据,而无需将整个文件加载到内存中。



archiver 的主要功能:

  • 创建具有可配置压缩级别的 ZIP 压缩包
  • 添加文件和整个目录
  • 基于流(streams)工作以节省内存
  • 支持注释和元数据


示例:创建简单的 ZIP 压缩包

const fs = require('fs');const archiver = require('archiver');

// 创建写入文件的流const output = fs.createWriteStream('example.zip');const archive = archiver('zip', { zlib: { level: 9 } }); // 最大压缩

// 处理事件output.on('close', () => { console.log(`压缩包已创建:${archive.pointer()} 字节`);});

archive.on('error', (err) => { throw err;});

// 添加文件archive.append('文件内容 1', { name: 'file1.txt' });archive.file('/path/to/existing/file.txt', { name: 'renamed-file.txt' });archive.directory('my_folder/', 'new_folder_name');

// 完成压缩archive.pipe(output);archive.finalize();


示例:流式传输压缩

const http = require('http');const archiver = require('archiver');

http.createServer((req, res) => { res.writeHead(200, { 'Content-Type': 'application/zip', 'Content-disposition': 'attachment; filename=download.zip' });

const archive = archiver('zip', { zlib: { level: 5 } }); archive.pipe(res);

archive.append('文本文件', { name: 'text.txt' }); archive.append(Buffer.from([0x00, 0x01, 0x02]), { name: 'binary.bin' }); archive.finalize();}).listen(3000);


adm-zip 库:读取和解压压缩包

adm-zip 是一个用于处理 ZIP 压缩包的多功能库:读取、写入、更新和解压。与 archiver 不同,它不仅可以处理流,还可以处理缓冲区,这对于小型压缩包非常方便。



adm-zip 的主要功能:

  • 读取现有的 ZIP 文件
  • 解压所有或单个文件
  • 写入新的压缩包(作为 archiver 的替代方案)
  • 处理缓冲区和字符串


示例:从压缩包中提取文件

const AdmZip = require('adm-zip');

// 加载现有压缩包const zip = new AdmZip('./example.zip');

// 获取文件列表const zipEntries = zip.getEntries();zipEntries.forEach((entry) => { console.log(`文件

推荐