Node.js流式读写文件的正确方式?图片复制后变大无效问题
问题原因与解决办法
你的代码问题出在将二进制数据流当作字符串拼接:
fs.createReadStream默认不指定编码时,data事件返回的是Buffer对象。当执行fileData += data时,Buffer会被隐式转换为UTF-8编码的字符串,而图片这类二进制文件的字节序列不符合UTF-8编码规则,转换过程中会生成大量无效替换字符,导致数据损坏、文件体积膨胀,最终无法正常解析为图片。
解决办法
方法1:用Buffer数组存储并合并数据
通过收集所有Buffer片段,最后用Buffer.concat()合并成完整的二进制数据再写入:
const fs = require('fs'); const fileReadStream = fs.createReadStream('/path/to/image.jpg'); const chunks = []; fileReadStream.on('data', (data) => { chunks.push(data); }); fileReadStream.on('end', () => { const fileData = Buffer.concat(chunks); fs.writeFileSync('/path/to/image_copy.jpg', fileData); });
方法2:使用流的pipe方法(推荐)
直接通过管道将读取流的数据导入写入流,Node.js会自动处理背压和流的生命周期,代码更简洁高效:
const fs = require('fs'); const readStream = fs.createReadStream('/path/to/image.jpg'); const writeStream = fs.createWriteStream('/path/to/image_copy.jpg'); readStream.pipe(writeStream); // 可选:监听完成事件确认复制完成 writeStream.on('finish', () => { console.log('文件复制完成'); });
内容的提问来源于stack exchange,提问作者antun
相关产品推荐
相关产品推荐

