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

Rails中通过POST方法传输文件时报400 Unsupported method错误如何解决?

错误原因排查
  • 核心原因:重复设置请求表单导致格式异常。代码先调用req.set_form配置了multipart/form-data类型的文件上传参数,后续又调用req.set_form_data传入mac参数,set_form_data方法会直接覆盖已设置的请求体,同时自动将请求头的Content-Type修改为application/x-www-form-urlencoded,完全覆盖了之前的multipart配置,服务器接收的请求不符合文件上传接口要求,因而返回400错误。
  • 参数格式错误:set_form方法要求传入二维数组格式的表单参数,每个表单字段为独立的[字段名, 字段值]子数组,代码中传入的['upload', File.open("#{file_name}")]为一维数组,会导致参数解析异常。
  • 可选排查项:确认目标URL确实支持POST请求,且路径填写完整,无遗漏接口路径后缀。
修复方案

将所有表单参数统一放到set_form的参数列表中,无需单独调用set_form_data,修正后的代码如下:

uri = URI(URL常量)
req = Net::HTTP::Post.new(uri)
# 所有参数统一放在二维数组中传入set_form
form_params = [
  ['upload', File.open(file_name)],
  ['mac', mac]
]
req.set_form(form_params, 'multipart/form-data')

http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
res = http.request(req)

case res
when Net::HTTPSuccess, Net::HTTPRedirection
  Rails.logger.info "File sent successfully"
  # 正常业务逻辑
else

额外注意事项

  • 打开的文件使用完成后建议手动关闭,也可以使用File.open的块调用形式自动释放资源,避免文件描述符泄漏。
  • 若修复后仍报错,可打印req['Content-Type']和req.body,确认请求格式是否匹配目标接口的要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 05:57:02