如何用Axios读取并解压Zip包中XML文件为字符串数组?
解决Zip包中XML文件提取为字符串数组的问题
你遇到的Error: Invalid filename核心原因是axios默认将响应解析为UTF-8字符串,而Zip是二进制文件,转成字符串会破坏原有结构,导致解压缩库无法识别。解决第一步就是让axios返回二进制Buffer。
修正axios配置 + 使用adm-zip实现需求
直接修改axios的请求配置,添加responseType: 'arraybuffer',然后用adm-zip处理Buffer,遍历所有文件筛选出XML,读取内容转为字符串存入数组:
const axios = require('axios'); const AdmZip = require('adm-zip'); const conf = { headers: { "Content-Type": "application/zip", }, auth: { username: "username", password: "password", }, // 关键配置:让axios返回二进制Buffer responseType: 'arraybuffer' }; try { const res = await axios.get("url", conf); const zip = new AdmZip(res.data); const zipFiles = []; // 遍历zip中的所有文件 zip.getEntries().forEach(entry => { // 筛选XML文件(排除目录,只处理文件) if (!entry.isDirectory && entry.name.endsWith('.xml')) { // 将文件内容转为字符串,存入数组 const xmlContent = entry.getData().toString('utf8'); zipFiles.push(xmlContent); } }); console.log(zipFiles); // 输出格式:["<?xml version...", "<?xml version...", ...] } catch (e) { console.log(e); }
备选方案:使用jszip实现
如果你更倾向于jszip,同样需要axios返回arraybuffer,然后按以下方式处理:
const axios = require('axios'); const JSZip = require('jszip'); const conf = { headers: { "Content-Type": "application/zip", }, auth: { username: "username", password: "password", }, responseType: 'arraybuffer' }; try { const res = await axios.get("url", conf); const zip = await JSZip.loadAsync(res.data); const zipFiles = []; // 遍历所有文件 for (const fileName of Object.keys(zip.files)) { const file = zip.files[fileName]; // 跳过目录,只处理XML文件 if (!file.dir && fileName.endsWith('.xml')) { const xmlContent = await file.async('string'); zipFiles.push(xmlContent); } } console.log(zipFiles); } catch (e) { console.log(e); }
关键注意点
- 必须设置
responseType: 'arraybuffer',确保axios返回的是二进制Buffer,而非被转码的字符串 - 筛选文件时要判断
isDirectory(adm-zip)或dir(jszip),避免把目录当成文件处理 - XML文件编码如果不是UTF-8,可以在
toString()时指定对应编码(比如toString('gbk'))
内容的提问来源于stack exchange,提问作者Sondge
相关产品推荐
相关产品推荐

