Node.js中Buffer与字符串互转及ZLIB压缩后PUT传输解压问题
解决Node.js中Buffer与字符串互转及ZLIB压缩传输问题
我刚踩过几乎一模一样的坑!核心问题在于:压缩后的Buffer是二进制数据,绝对不能用默认的utf-8编码转字符串——utf-8会把无法识别的二进制字节替换成乱码,直接导致接收端无法还原原始数据。正确的做法是用base64或者hex这类专门用于二进制转文本的编码,它们能保证数据完整无损。
下面是完整的端到端流程代码,直接就能用:
发送端(压缩Buffer转字符串并发送PUT请求)
const zlib = require('zlib'); const axios = require('axios'); // 用原生http模块也可以,写法稍复杂些 // 你的原始字符串内容 const originalStr = '这是需要压缩的大段文本、JSON或者其他内容...'; // 1. 用zlib把字符串压缩成Buffer zlib.gzip(originalStr, (err, compressedBuffer) => { if (err) throw err; // 2. 把压缩后的Buffer转成base64字符串(这步是关键!) const base64Str = compressedBuffer.toString('base64'); // 3. 发送PUT请求 axios.put('https://你的接收端接口地址', base64Str, { headers: { 'Content-Type': 'text/plain' // 接口如果要求JSON,就把base64放到JSON里发送 } }) .then(res => console.log('发送成功')) .catch(err => console.error('发送失败:', err)); });
接收端(将字符串转回Buffer并解压)
const zlib = require('zlib'); const express = require('express'); // 用express做示例,其他框架逻辑一致 const app = express(); // 解析文本类型的请求体 app.use(express.text()); app.put('/your-endpoint', (req, res) => { // 1. 获取发送过来的base64字符串 const receivedBase64Str = req.body; try { // 2. 把base64字符串转回Buffer(必须指定编码为base64) const compressedBuffer = Buffer.from(receivedBase64Str, 'base64'); // 3. 用zlib解压Buffer zlib.gunzip(compressedBuffer, (err, decompressedBuffer) => { if (err) throw err; // 4. 把解压后的Buffer转成原始字符串 const originalStr = decompressedBuffer.toString('utf-8'); console.log('还原的原始内容:', originalStr); res.send('解压成功'); }); } catch (err) { console.error('处理失败:', err); res.status(500).send('解压失败'); } }); app.listen(3000, () => console.log('接收端服务已启动'));
必看注意事项
- 编码一致性:发送端转字符串和接收端转回Buffer必须用同一个编码(这里用的base64,hex也可以,原理完全一致)。
- 禁止用utf-8转压缩Buffer:压缩后的二进制数据包含大量utf-8无法解析的字节,转字符串时会直接损坏数据,接收端永远还原不回来。
- 适配接口要求:如果你的PUT接口要求
application/json格式,只需把base64字符串放到JSON对象里(比如{ "data": base64Str }),接收端先解析JSON再处理base64即可。
内容的提问来源于stack exchange,提问作者jack
相关产品推荐
相关产品推荐

