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

如何通过JavaScript向Rails后端发送multipart form data请求

问题原因

首先梳理两个错误的根本原因:

  • 直接把JS对象play_sessionappend到FormData中时,浏览器会自动调用对象的toString()方法,导致传到后端的是字符串[object Object],不符合Rails期望的嵌套参数结构,自然无法调用permit方法做参数校验。
  • 手动设置Content-Type: multipart/form-data请求头是错误的:当请求体是FormData类型时,浏览器会自动生成带boundary分隔符的Content-Type头,手动设置会覆盖掉分隔符信息,导致Rails无法正确解析表单字段。

修正后的代码

async function uploadFile(blob) {
  let formData = new FormData();
  // 按照Rails嵌套参数的命名规则逐个append字段
  formData.append("play_session[comment]", "SUPER GOOD COMMENT");
  formData.append("play_session[time_in_minutes]", 23);
  formData.append("play_session[video]", blob);

  try {
    let response = await fetch(
      "http://localhost:3000/front/play_sessions",
      {
        method: "POST",
        // 只需要指定Accept头,不要手动加Content-Type
        headers: {
          "Accept": "application/json"
        },
        body: formData
      }
    );
    console.log("HTTP response:", response);
  } catch(e) {
    console.log("Huston we have problem...:", e);
  }
}

改造后Rails就能正确解析到嵌套的play_session参数,包含普通字段和上传的文件,和Rails测试用例的参数结构完全对齐。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 00:36:05