如何提取tar文件内容并写入磁盘?API返回tar文件异常排查
问题描述
调用REST API接口后,收到的响应为Buffer格式(示例:<Buffer 4d 4d 00 2a 00 00 00 08 00 13 01 00 00 03 00 00 00 01 01......>),该响应应当是包含6个文件的tar包,但用下方代码保存为output.tar后,打开仅能看到1个文件,请问代码哪里操作有误?
代码片段:
connectForTar(options, body, onResult) { const resCallback = (response) => { if (response.statusCode < 200 || response.statusCode > 299) { onResult(response.statusCode, null, ({msg:'Did not get an OK from the server',statusMessage:statusMessage})); response.resume(); return; } let data = []; let buffer = null; response.on('data', (chunk) => { data.push(chunk); }); response.on('end', () => { buffer = Buffer.concat(data); onResult(response.statusCode, buffer, null); fs.writeFileSync('C:\\..\\.....\\..\\..\\..\\webservices\\projects\\..\\controller\\IO\\tars\\output.tar', buffer); }); } }
可能的错误原因及解决办法
- 二进制内容被编码转换损坏:检查API返回的
Content-Type是否为application/x-tar或application/octet-stream。如果服务器返回的响应被Node.js自动按文本编码(如utf-8)处理,会导致二进制tar包内容被篡改。解决方式:在监听data事件前添加response.setEncoding('binary');,确保以二进制方式接收数据。 - 文件路径的相对路径异常:代码中的路径包含多个
..,可能导致实际写入的文件位置并非预期目录,你打开的output.tar可能不是最新生成的文件。建议使用path.resolve构建可靠的绝对路径:const path = require('path'); const outputPath = path.resolve(__dirname, 'tars', 'output.tar'); fs.writeFileSync(outputPath, buffer); - 响应数据接收不完整:对比
buffer.length和响应头中的Content-Length值,如果长度不一致,说明接收过程中丢失了数据。另外可借助tar-fs包直接解析内存中的Buffer,验证是否包含6个文件:const tar = require('tar-fs'); tar.read(buffer, (err, entries) => { if (err) throw err; console.log('文件列表:', entries.map(e => e.name)); }); - 未处理响应错误事件:
response对象触发error事件时,会导致数据接收提前终止,需要添加错误监听:response.on('error', (err) => { console.error('接收响应出错:', err); onResult(500, null, {msg: '接收数据失败', error: err}); });
内容的提问来源于stack exchange,提问作者Amr
相关产品推荐
相关产品推荐

