Skip to content

zip

使用zip进行 zip 压缩包的压缩和解压操作。

压缩

zip 提供了一个相对简单的压缩接口,只需要把文件名和文件内容存入一个对象接口中,然后传入 zip.compression() 中即可,返回二进制 Buffer 对象。

ts
import * as zip from 'zip';
import * as buffer from 'buffer';

const buf = zip.compression({
  文件名: '内容',
});
buf.toString(buffer.Encoding.Base64); // 返回 base64 字符串

为了保护文件安全,压缩时只允许压缩带有文件名后缀的文件。

解压

zip 提供了 zip 压缩包的读取接口,该接口是流式数据读取接口,可对部分文件进行读取而不需要全量读取。

一个通过 base64 遍历 zip 包读取的例子如下:

ts
import * as zip from 'zip';
import * as buffer from 'buffer';

// 从 base64 字符串中解码出二进制并构建 zip 读取器
const base64Str = '...';
const reader = zip.readZip(buffer.from(base64Str, buffer.Encoding.Base64));
// 遍历 zip 包的文件路径,根据条件查出一个文件进行读取
const file = reader.listFiles().find(f => /* 找到某个条件的文件 */);
if (!file) {
    // 处理找不到文件的逻辑
}
// 得到文件对象,并进行读取
const bytes = file.readData();
// 把 byte 数组转成 buffer 并转成字符串
buffer.fromBytes(bytes).toString();

也可以直接通过路径读取:

ts
import * as zip from 'zip';
import * as buffer from 'buffer';

// 从 base64 字符串中解码出二进制并构建 zip 读取器
const base64Str = '...';
const reader = zip.readZip(buffer.from(base64Str, buffer.Encoding.Base64));
// 从“文件名”直接读取解压后的文件内容
const bytes = reader.readData('文件名');
// 把二进制数组转成字符串
buffer.fromBytes(bytes).toString(); // 把 byte 数组转成 buffer 并转成字符串

平台限制了单个解压文件的大小(可通过系统参数限制,详情可联系运维管理员)。

关于如何处理上传文件,可以参考文件上传文档。