You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从JS对象创建可增量添加、按需提取键的Zip归档

直接从对象创建/追加Zip归档,并按需提取指定内容

核心思路

无需将对象内容先保存为磁盘文件,直接通过流式操作完成Zip归档的增量创建与指定内容提取:

  • 用archiver实现增量添加:直接将字符串/Buffer形式的对象内容写入Zip,跳过磁盘文件落地步骤
  • 用node-stream-zip实现按需提取:直接从Zip归档中读取指定条目内容,无需解压整个文件

实现步骤

1. 安装依赖

npm install archiver node-stream-zip

2. 实现addToArchive(增量添加内容)

支持将对象键值对转为Zip中的文件,还能按你的需求生成多级目录路径:

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

function addToArchive(zipPath, data) {
  return new Promise((resolve, reject) => {
    const isExists = fs.existsSync(zipPath);
    // 以追加或新建模式打开文件流
    const outputStream = fs.createWriteStream(zipPath, { flags: isExists ? 'a' : 'w' });
    const archive = archiver('zip', { zlib: { level: 9 } });

    outputStream.on('close', resolve);
    archive.on('error', reject);

    // 已存在的Zip需开启追加模式
    if (isExists) {
      archive.pipe(outputStream, { append: true });
    } else {
      archive.pipe(outputStream);
    }

    // 遍历对象,将键值对转为Zip内的文件
    Object.entries(data).forEach(([key, content]) => {
      const targetFilePath = generateMultiLevelPath(key); // 按规则生成多级路径
      archive.append(content, { name: targetFilePath });
    });

    archive.finalize();
  });
}

// 示例:根据文件名生成多级目录路径(匹配你原有的文件夹结构)
function generateMultiLevelPath(filename) {
  if (filename.length < 3) return `${filename}/${filename}.txt`;
  const pathSegments = [filename[0], filename.slice(0, 2), filename.slice(0, 3)];
  return `${pathSegments.join('/')}/${filename}.txt`;
}

3. 实现extractFromArchive(提取指定内容)

直接读取Zip中指定路径的文件内容,无需解压整个归档:

const StreamZip = require('node-stream-zip');

async function extractFromArchive(zipPath, key) {
  const targetFilePath = generateMultiLevelPath(key);
  const zip = new StreamZip.async({ file: zipPath });

  try {
    // 读取文件内容并转为字符串
    const contentBuffer = await zip.entryData(targetFilePath);
    return contentBuffer.toString('utf8');
  } finally {
    await zip.close();
  }
}

4. 使用示例

// 增量添加内容
await addToArchive('archive.zip', { able: 'dsaf 2342 sdf' });
await addToArchive('archive.zip', { abner: 'hsf= 424 asfs' });
await addToArchive('archive.zip', { about: 'sds 322dfs df 23' });

// 后期提取指定内容
const abnerContent = await extractFromArchive('archive.zip', 'abner');
console.log(abnerContent); // 输出 'hsf= 424 asfs'

关键注意事项

  • 追加限制:archiver的追加模式仅支持新增条目,无法修改已存在的同名文件;若需覆盖,需先删除Zip内对应条目(建议批量新增时避免重复键)
  • 性能优化:针对数十万条数据,建议批量添加(比如每次处理1000条),减少文件IO次数
  • 内存友好:两个库均采用流式处理,不会将整个Zip加载到内存,适合大归档操作

内容的提问来源于stack exchange,提问作者punkish

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 03:35:04