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

Ajax发送POST请求后端Controller收不到数据,移除Image字段后正常

问题诱因

  • 你直接将Uint8Array类型的文件字节数组存入对象后执行JSON.stringify序列化,得到的会是按索引排列的键值对结构(如{"0":123,"1":45,...})而非连续字节串,会导致序列化后的JSON体积比原始文件大3~4倍。
  • 你当前使用默认的application/x-www-form-urlencoded格式提交请求,ASP.NET对表单参数的默认长度限制一般为4MB以内,超大参数会被服务端直接拦截丢弃,导致dataToSend接收为空。
  • 即便参数长度符合要求,Uint8Array序列化后的结构也无法和后端Product类的Image字段匹配,反序列化也会失败。

解决方案

方案1:最小改动适配现有逻辑

  1. 前端将字节数组转为Base64字符串后再存入参数,新增Base64转换方法:
function arrayBufferToBase64(buffer) {
    let binary = '';
    const bytes = new Uint8Array(buffer);
    for (let i = 0; i < bytes.byteLength; i++) {
        binary += String.fromCharCode(bytes[i]);
    }
    return window.btoa(binary);
}

修改文件读取逻辑直接返回Base64:

async function getAsBase64(file) {
    return arrayBufferToBase64(await readFile(file))
}
// 赋值Image字段时改用返回的Base64
item["Image"] = await getAsBase64(txtImage);
  1. 调整ASP.NET请求长度限制,在web.config中添加配置:
<system.web>
  <!-- 单位KB,设置为10240即10MB,可按需调整 -->
  <httpRuntime maxRequestLength="10240" /> 
</system.web>
<system.webServer>
  <security>
    <requestFiltering>
      <!-- 单位字节,对应10MB -->
      <requestLimits maxAllowedContentLength="10485760" /> 
    </requestFiltering>
  </security>
</system.web>
  1. 后端Product类的Image字段改为string类型,需要存字节数组时调用Convert.FromBase64String转换即可。

方案2:更规范的JSON请求模式(推荐)

  1. 前端调整Ajax请求配置,直接提交JSON作为请求体:
$.ajax({
    url: "/Admin/SaveProductToDB",
    type: "POST",
    contentType: "application/json;charset=utf-8",
    data: jsonString, // 直接传序列化后的JSON字符串,不需要包裹为dataToSend对象
    success: function (data) {
        // 原有成功逻辑保持不变
    }
});
  1. 后端接口添加[FromBody]注解,框架自动完成反序列化,不需要手动解析:
public JsonResult SaveProductToDB([FromBody] List<Product> dataToSend)
{
    // 直接使用dataToSend即可,无需手动调用JsonConvert反序列化
}

同样需要完成方案1中的Base64转换和请求长度配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 05:54:03