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

不使用FormData库,Node.js构造Multipart表单请求报错求助

手动构建multipart/form-data请求的错误修正

你手动构建multipart请求的思路没问题,但请求体的格式有几个关键错误,导致服务端无法正确解析:

  • 换行符使用错误:multipart协议要求用\r\n作为换行分隔符,你在模板字符串里同时用了换行和\n,会生成多余的换行,破坏格式。
  • 头部与内容之间缺少空行:每个表单项的HTTP头部(比如Content-Disposition)和实际内容之间,必须有一个空行(即\r\n\r\n),你现在直接把头部和内容连在一起了。
  • boundary标记格式错误:每个boundary行要以--BOUNDARY\r\n开头,结尾的结束标记必须是--BOUNDARY--\r\n,确保请求体正确收尾。

修正后的代码如下:

import { RequestOptions } from "http"

const path = 'url/'
const method = 'POST'

// 严格遵循multipart格式:用\r\n换行,头部与内容间加\r\n\r\n
const body = `--BOUNDARY\r\nContent-Disposition: form-data; name="file"; filename="test.txt"\r\nContent-Type: text/plain\r\n\r\nThis is the content of the file\r\n--BOUNDARY\r\nContent-Disposition: form-data; name="form-field-one"\r\n\r\nexample1\r\n--BOUNDARY\r\nContent-Disposition: form-data; name="form-field-two"\r\n\r\nexample2\r\n--BOUNDARY--\r\n`

const headers = {
  'content-type': 'multipart/form-data; boundary=BOUNDARY',
  // 明确指定utf8编码计算字节长度,避免编码差异导致长度错误
  'content-length': String(Buffer.byteLength(body, 'utf8'))
}

const options = {
  path,
  method,
  headers,
  body
}

const response = await execute(options)

额外建议:

  • 不要用固定的BOUNDARY字符串,建议用crypto.randomBytes(16).toString('hex')生成随机边界,避免和请求体内容冲突导致解析失败。
  • 如果文件内容包含特殊字符(比如中文、二进制数据),要确保编码一致,二进制文件建议转成base64或者直接用Buffer拼接请求体。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 02:05:17