zip文件是一种常见压缩文件格式,可以将多个文件文件夹打包一个文件节省空间和方便传输。在Node.js中,如果我们需要创建提取zip文件我们可以使用一个叫做adm-zipnpm模块adm-zip一个纯Javascript实现的zip库,不依赖于其他模块使用起来也很简单本文介绍如何adm-zip模块进行zip文件的创建提取

创建zip文件

创建一个zip文件,我们首先需要引入adm-zip模块,并创建一个AdmZip的实例。AdmZip的实例对应于一个zip文件,如果我们想要创建一个新的zip文件,我们需要传递任何参数构造函数

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

然后我们可以用不同的方法向file添加文件或文件夹例如,我们可以用addLocalFile方法通过文件名本地加一个文件,或者用addLocalFolder方法通过文件夹名从本地加一文件夹。这些方法的第二个参数指定在zip中存放路径,如果省略,则默认根目录

// 添加一本地文件
file.addLocalFile('./package.json');
// 添加一本地文件夹
file.addLocalFolder('./node_modules', 'node_modules');

我们也可以用addFile方法从原始的Node.js缓冲区加一个文件,这样就不需要本地创建一个临时文件。这个方法的第一个参数指定在zip中存放路径文件名第二个参数是指定缓冲区内容

// 添加一缓冲区内容为"Hello, World"的文本文件
file.addFile('hello.txt', Buffer.from('Hello, World'));

最后,我们可以用两种方法将file写入到一个zip文件中。一种是用toBuffer法将file转换为一个缓冲区,并用fs模块写入本地。另一种是用writeZip方法直接写入本地

// 写入zip文件的第一种方法:将其转换为缓冲区使用fs
const fs = require('fs');
fs.writeFileSync('output.zip', file.toBuffer());

// 写入zip文件的第二种方法:writeZip
file.writeZip('output.zip');

提取zip文件

要提取一个zip文件,我们也需要引入adm-zip模块,并创建一个AdmZip的实例。但这次,我们需要将要提取的zip文件的路径作为参数传递构造函数

const AdmZip = require('adm-zip');
const file = new AdmZip('./output.zip');

然后,我们可以用两种方法从file中提取内容。一种是用extractAllTo方法将所有内容提取到指定的目录中。另一种是用extractEntryTo方法提取单个条目到指定的目录中。

// 提取所有内容output目录
file.extractAllTo('./output');

// 提取单个条目到当前目录
file.extractEntryTo('hello.txt', './');

处理中文乱码问题

如果我们使用adm-zip模块处理包含中文名称的文件或文件夹,我们可能遇到乱码问题。这是因为adm-zip模块默认使用UTF-8编码解析生成条目名称,而某些压缩软件可能使用GBK或其他编码生成zip文件。为了解决这个问题,我们可以使用另一个npm模块iconvlite来转换编码

首先,我们需要安装iconvlite模块,并引入它。

const iconv = require('iconv-lite');

然后,在提取zip文件之前,我们需要遍历所有条目,并用iconv.decode法将原始条目名称(rawEntryName)转换为正确的编码(例如GBK),并赋值给条目名称(entryName)。

// 遍历所有条目
const zipEntries = file.getEntries();
for (let i = 0; i < zipEntries.length; i++) {
  const entry = zipEntries[i];
  // 将原始条目名称转换为GBK编码,并赋值给条目名称
  entry.entryName = iconv.decode(entry.rawEntryName, 'gbk');
}

这样就可以避免提取时出现乱码问题了。

总结

zip文件是一种常见且有用的压缩格式,在Node.js中,我们可以使用adm-zip模块来方便地创建和提取zip文件。adm-zip模块提供了多种方法来添加和提取不同类型和来源内容,并且不依赖于其他模块。但是,在处理包含中文名称的内容时,我们需要注意编码问题,并使用iconv-lite模块来进行转换。

原文地址:https://blog.csdn.net/2301_76635548/article/details/131007913

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_42884.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注