.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
相关产品推荐
相关产品推荐

