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

Node.js中FormData上传图片报错:source.on is not a function

解决Node.js上传文件时"source.on is not a function"错误

问题原因分析

你的代码存在两个核心问题:

  • 配置项放错位置:maxBodyLength和maxContentLength是axios的请求配置参数,不属于请求头范畴,放在headers对象里会导致axios无法正确解析。
  • FormData处理及请求头配置错误:Node.js环境下直接传递buffer到FormData易引发流处理异常,且未正确设置带boundary的Content-Type,导致axios无法识别请求体格式。

修正后的代码

const fs = require('fs');
const FormData = require('form-data'); // 确保已安装form-data库
const axios = require('axios');

const uploadFile = async () => {
  // 用可读流替代readFileSync,兼容性和性能更优
  const fileStream = fs.createReadStream('scripts/pose.png');
  const formData = new FormData();

  // 传递文件流并指定文件名、类型
  formData.append('file', fileStream, {
    filename: 'dummyName.png',
    contentType: 'image/png'
  });

  // 合并授权头和FormData自动生成的请求头(含boundary)
  const headers = {
    Authorization: `Bearer ${jwt}`,
    ...formData.getHeaders()
  };

  const response = await axios.post(
    `${process.env.URL}/v1/files`,
    formData,
    {
      headers,
      maxBodyLength: Infinity,
      maxContentLength: Infinity // 这两个参数放在请求配置中而非headers
    }
  );

  return response;
};

关键修正点说明

  • 替换buffer为文件流:fs.createReadStream比readFileSync更适合文件上传场景,FormData在Node.js环境下对流的支持更稳定,避免buffer引发的流处理错误。
  • 正确配置请求头:通过formData.getHeaders()获取带boundary的Content-Type,手动合并Authorization,确保请求头格式符合要求。
  • 调整axios配置位置:将maxBodyLength和maxContentLength移至axios的请求配置对象中,而非headers字段内。

额外注意事项

  • 先安装依赖:执行npm install form-data或yarn add form-data。
  • 若必须使用buffer,可将其包装为可读流:
    const { Readable } = require('stream');
    const bufferStream = Readable.from(buffer);
    formData.append('file', bufferStream, 'dummyName.png');
    

内容的提问来源于stack exchange,提问作者MayAsk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 04:52:09