You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 03:24:52