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

如何通过Node.js使用https.get直接下载并解压Zip文件?

使用Node.js标准库直接下载并解压Zip文件是否可行?

我想了解是否可以使用Node标准库中的https.get()下载Zip文件并直接解压到子文件夹中。目前找到的方案都是先下载Zip文件再进行解压,但想知道是否有直接处理的方法。尝试代码如下:

const zlib = require("node:zlib");
const fs = require("fs");
const { pipeline } = require("node:stream");
const https = require("https");

const DOWNLOAD_URL =
  "https://downloadserver.com/data.zip";
const unzip = zlib.createUnzip();
const output = fs.createWriteStream("folderToExtract");

https.get(DOWNLOAD_URL, (res) => {
  pipeline(res, unzip, output, (error) => {
    if (error) console.log(error);
  });
});

运行后出现错误:

Error: incorrect header check
at Zlib.zlibOnError [as onerror] (node:zlib:189:17) {
errno: -3,
code: 'Z_DATA_ERROR'
}

这种直接处理的方式是否可行?


解答

流式边下载边解压的思路是可行的,但你的代码存在两个关键问题:

  1. zlib无法解析标准Zip文件
    zlib.createUnzip()仅支持gzip/deflate格式的压缩数据,而标准Zip文件包含独立的文件目录结构和元数据,zlib模块没有处理这类结构的能力,这就是触发Z_DATA_ERROR的根本原因。

  2. WriteStream不能直接写入文件夹
    fs.createWriteStream("folderToExtract")试图将解压内容写入目录,但WriteStream仅能操作文件,无法直接与目录交互,后续会引发写入错误。

基于标准库的可行实现

Node.js标准库未内置Zip文件结构解析模块,因此可以通过child_process调用系统自带的解压命令(如unzip或tar)实现流式处理:

const https = require('node:https');
const { spawn } = require('node:child_process');
const fs = require('node:fs');

const DOWNLOAD_URL = "https://downloadserver.com/data.zip";
const EXTRACT_DIR = "./folderToExtract";

// 确保目标目录存在,不存在则创建
fs.mkdirSync(EXTRACT_DIR, { recursive: true });

// 调用系统unzip命令,从标准输入读取数据并解压到指定目录
const unzipProcess = spawn('unzip', ['-q', '-d', EXTRACT_DIR, '-'], {
  stdio: ['pipe', 'inherit', 'inherit']
});

https.get(DOWNLOAD_URL, (res) => {
  // 将HTTP响应流直接传入unzip进程的标准输入
  res.pipe(unzipProcess.stdin);

  // 监听解压进程结束事件
  unzipProcess.on('close', (code) => {
    if (code === 0) {
      console.log('解压完成');
    } else {
      console.error(`解压失败,进程退出码:${code}`);
    }
  });

  // 处理数据流错误
  unzipProcess.stdin.on('error', (err) => {
    console.error('数据流传输错误:', err);
  });
});

补充说明

  • 该方案通过流式传输将下载数据直接传给系统解压命令,无需预先保存完整Zip文件。
  • 参数说明:-q让unzip静默执行,-d指定解压目标目录,-表示从标准输入读取数据。
  • Windows系统下,若未安装unzip,可改用tar命令(Windows 10+默认支持),将spawn的参数改为['tar', '-xf', '-', '-C', EXTRACT_DIR]。

如果不想依赖系统命令,则必须使用第三方库(如adm-zip、extract-zip),但这些不属于Node.js标准库范畴。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 03:00:59