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

.NET控制器如何接收ArrayBuffer?React Native传图遇ModelState报错

问题分析与解决方案

错误根源

你当前的前端转换逻辑存在问题:使用Uint16Array(16位无符号整数数组)处理Base64字符串,每个字符被转换为占2字节的16位值,但后端的byte[]是8位单字节数组,这种格式不匹配直接导致ModelState验证失败。Base64字符串的每个字符对应ASCII单字节值,用Uint16Array会额外填充无效字节,造成数据格式混乱。

正确的Base64转二进制ArrayBuffer代码

替换原有转换逻辑,改用Uint8Array处理单字节流:

function base64ToArrayBuffer(base64) {
  const binaryString = atob(base64);
  const buffer = new ArrayBuffer(binaryString.length);
  const uint8View = new Uint8Array(buffer);
  
  for (let i = 0; i < binaryString.length; i++) {
    uint8View[i] = binaryString.charCodeAt(i);
  }
  
  return buffer;
}

请求发送正确姿势

直接发送ArrayBuffer会导致后端解析异常,建议用FormData封装数据(后端可直接绑定模型):

const formData = new FormData();
// 序列化Person数据为JSON字符串
formData.append('person', JSON.stringify(yourPersonData));
// 将二进制Buffer包装为Blob后添加
formData.append('pImage', new Blob([base64ToArrayBuffer(yourBase64Image)], { type: 'image/jpeg' }));

// 发送POST请求
fetch('/api/your-endpoint', {
  method: 'POST',
  body: formData
});

后端接口需添加[FromForm]标记以支持表单数据绑定:

[HttpPost]
public IActionResult AddPerson([FromForm] DPerson model)
{
    // 业务逻辑处理
    return Ok();
}

补充说明

  • 之前用string类型能正常运行,是因为Base64字符串属于文本格式,JSON可直接序列化/反序列化,后端能正确解析。
  • 如果坚持用JSON格式传输,无法直接传递二进制数据(JSON不支持二进制类型),最终还是得用Base64字符串,这和你之前的可行方案一致。若想减少后端计算量,FormData传递二进制流是更优选择。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 00:40:42