Node.js中如何解压HTTPS请求获取的zip文件并提取内部XML数据
核心问题有两点:
zlib.gunzip仅支持解压gzip格式的内容,你请求得到的是标准ZIP压缩包,两种格式结构不兼容,所以会报头校验错误。从你提供的响应头可以看到content-type为application/zip,返回的文件名后缀也是.zip,可以确认返回内容是ZIP格式,不是gzip格式。- 请求头中配置的
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
相关产品推荐
相关产品推荐

