Node.js中如何正确保存PNG文件?该数据格式是什么?
问题解答
1. 数据格式与转换问题
你的PNG数据原本是二进制格式,但后端getBody函数里把请求体Buffer转成了utf8字符串,这直接破坏了二进制数据的完整性——PNG包含大量无法用UTF-8编码正确映射的字节,转成字符串再转回Buffer时,这些字节会被替换成无效占位符,导致数据永久损坏,无法恢复成可用的PNG二进制。
这种损坏是不可逆的,当前你拿到的file.value已经是被破坏的字符串,没法直接转成正常的PNG数据。必须从根源上修改后端的请求体解析逻辑,避免把二进制数据转成UTF-8字符串。
2. 正确保存到文件系统的方法
第一步:修复请求体解析逻辑
不要将请求体转成UTF-8字符串,直接保留原始Buffer格式:
const getBody = async (req) => { return await new Promise((done) => { const buffers = []; req.on("data", (chunk) => { buffers.push(chunk); }); req.on("end", () => { done(Buffer.concat(buffers)); // 直接返回Buffer,跳过utf8转换 }); }); }; const rawData = await getBody(req);
第二步:用成熟库解析FormData(推荐)
手动解析multipart/form-data格式极易出错,建议用现成的库处理,比如formidable:
import { IncomingForm } from 'formidable'; const form = new IncomingForm(); form.parse(req, async (err, fields, files) => { if (err) throw err; // files.icon.png是上传的文件对象,直接复制到目标路径 await fsp.copyFile(files.icon.png.filepath, `./${name}`); });
手动解析(不推荐)
如果一定要自己处理multipart请求体,需严格按照multipart/form-data规范拆分请求体,提取出文件对应的二进制块,直接用这个Buffer写入文件:
// 假设已正确提取出PNG的二进制Buffer(fileBuffer) await fsp.writeFile(name, fileBuffer); // 默认二进制模式,无需指定编码
内容的提问来源于stack exchange,提问作者Francisco Presencia
相关产品推荐
相关产品推荐

