在 Node.js 中处理 ZIP 压缩包:完整指南

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

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

开始课程

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



在现代 Node.js 网络开发中,经常需要处理压缩包:打包日志、批量传输文件、解压用户上传的数据。在本文中,我们将介绍两个用于处理 ZIP 格式的主要库——adm-zip 和 archiver。它们几乎可以解决所有与压缩相关的任务,既适用于简单的脚本,也适用于生产级应用。



adm-zip 库:用于读取和写入 ZIP 的通用工具



adm-zip 是一个纯 JavaScript 实现的 ZIP 压缩包处理库,无需外部依赖。它既可以创建新的压缩包,也可以读取/修改现有的压缩包。该库使用简单,无需安装额外的系统工具。



安装

npm install adm-zip


创建 ZIP 压缩包

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

// 创建一个新的压缩包实例const zip = new AdmZip();

// 从缓冲区或字符串添加文件zip.addFile('hello.txt', Buffer.from('Hello, World!', 'utf8'));

// 添加本地文件zip.addLocalFile('/path/to/image.png');

// 添加整个文件夹zip.addLocalFolder('/path/to/documents', 'docs');

// 将压缩包写入磁盘zip.writeZip('./output/archive.zip');

console.log('压缩包创建成功!');


读取和解压现有压缩包

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

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

// 获取文件列表const zipEntries = zip.getEntries();zipEntries.forEach((entry) => { console.log(`文件: ${entry.entryName}, 大小: ${entry.header.size} 字节`);});

// 将所有文件解压到指定文件夹zip.extractAllTo('./extracted', true); // true — 覆盖现有文件

// 或者获取特定文件的内容const content = zip.readAsText('data.json');console.log('data.json 的内容:', content);


使用缓冲区(无需写入磁盘)

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

zip.addFile('report.csv', 'id,name,age1,John,30');

// 将压缩包作为 Buffer 获取,以便通过 HTTP 发送const archiveBuffer = zip.toBuffer();

// 现在可以将 archiveBuffer 作为服务器响应发送// 或传递给其他函数


archiver 库:高级流式压缩



archiver 是一个更强大的库,针对处理大量数据进行了优化。它使用 Node.js 的流(streams),允许“即时”压缩文件,而无需将全部内容加载到内存中。这是资源受限的服务器应用程序的理想选择。



安装

npm install archiver


使用流式输出创建压缩包

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

// 创建一个写入流const output = fs.createWriteStream('./backup.zip');const archive = archiver('zip', { zlib: { level: 9 } // 最大压缩级别});

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

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

// 将压缩流连接到输出文件archive.pipe(output);

// 添加文件archive.file('/var/log/app.log', { name: 'logs/app.log' });

// 递归添加目录archive.directory('uploads/', 'user_files');

// 将字符串作为文件添加archive.append('这是文件内容', { name: 'readme.txt' });

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


通过 HTTP 响应发送压缩包

const express = require('ex                    

推荐