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

Node.js中如何解压HTTPS请求获取的zip文件并提取内部XML数据

核心问题有两点:

  1. zlib.gunzip仅支持解压gzip格式的内容,你请求得到的是标准ZIP压缩包,两种格式结构不兼容,所以会报头校验错误。从你提供的响应头可以看到content-type为application/zip,返回的文件名后缀也是.zip,可以确认返回内容是ZIP格式,不是gzip格式。
  2. 请求头中配置的accept-encoding: 'gzip,deflate'没有必要,这个字段是用于告知服务端可以对HTTP传输内容额外做gzip/deflate压缩,和目标文件本身的压缩格式无关。你拿到的响应头中没有content-encoding字段,说明服务端没有对传输内容做额外压缩,返回的就是原始的ZIP文件内容。

解决方法

先移除不必要的accept-encoding请求头配置,再使用支持ZIP格式解析的库处理返回的buffer即可,这里用常用的adm-zip库做示例。
首先安装依赖:
npm install adm-zip

修改后的代码如下:

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

// 从指定URL获取文件buffer
const getFile = url => {
  return new Promise((resolve, reject) => {
    https
      .get(url, res => {
        const chunks = [];
        res.on('data', chunk => chunks.push(chunk));
        res.on('end', () => resolve(Buffer.concat(chunks)));
      })
      .on('error', e => {
        console.log('请求出错');
        reject(e);
      });
  });
};

// 从ZIP buffer中提取XML内容
const getXmlFromZip = zipBuffer => {
  const zip = new AdmZip(zipBuffer);
  const allEntries = zip.getEntries();
  // 筛选压缩包内的XML文件,可根据实际文件名调整匹配规则
  const xmlFile = allEntries.find(item => item.name.endsWith('.xml'));
  if (!xmlFile) throw new Error('压缩包内未找到目标XML文件');
  return zip.readAsText(xmlFile, 'utf-8');
};

(async () => {
  try {
    const zipBuffer = await getFile('https://donnees.roulez-eco.fr/opendata/jour');
    const xmlContent = getXmlFromZip(zipBuffer);
    console.log('提取XML成功,内容长度:', xmlContent.length);
    // 此处可继续处理xmlContent
  } catch (err) {
    console.error('运行出错:', err);
  }
})();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 12:45:01