Node.js读取PNG文件输出与cat命令不一致问题求解
问题产生原因
- 二进制文件编码转换错误:PNG属于二进制文件,字节序列不符合UTF-8/UTF-16等文本编码的规则。你的代码中调用
toString()方法时会默认用UTF-8编码解码原始二进制数据,遇到不符合编码规则的字节会自动替换为�(无效字符替换符),直接篡改了原始文件的字节内容,导致文件结构损坏。 - 额外换行符注入:
console.log方法会在所有输出内容的末尾自动追加一个换行符\n,哪怕你输出的是原始二进制数据,多出来的这个字节也会破坏PNG文件的尾部结构,导致文件无法被识别。
尝试更换其他文本编码的操作只会让解码错配更严重,和预期效果偏差更大。
解决方法
要实现和cat命令完全等价的效果,需要做到不做任何编码转换、不追加额外字符,直接将原始二进制流输出到标准输出。
最简实现(适合小文件)
使用process.stdout.write方法直接输出readFileSync返回的原始Buffer即可,该方法不会自动追加换行,也不会对Buffer做编码转换:
单行命令:
node -e 'process.stdout.write(require("fs").readFileSync("static/small.png"))'
展开代码:
const fs = require("fs"); process.stdout.write(fs.readFileSync("static/small.png"));
流式实现(适合大文件,内存占用更低)
用可读流对接标准输出流,边读边写,无需一次性加载整个文件到内存:
单行命令:
node -e 'require("fs").createReadStream("static/small.png").pipe(process.stdout)'
展开代码:
const fs = require("fs"); fs.createReadStream("static/small.png").pipe(process.stdout);
修复后将输出重定向到新文件,即可得到和原文件MD5完全一致的可识别PNG文件。
内容的提问来源于stack exchange,提问作者Matthias
相关产品推荐
相关产品推荐

