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

如何通过AJAX将字节数组正确传递至Java的HttpExchange?

解决字节数组通过JSON传递到HttpExchange的问题

问题原因

直接通过$.ajax传递字节数组时,jQuery默认会将数据编码为表单格式(application/x-www-form-urlencoded),字节数组无法被正确编码,导致后端HttpExchange无法读取到有效内容。要通过JSON传递,需将字节数组转换为Base64字符串——因为JSON不支持原生存储二进制数据,Base64是通用的二进制转文本方案。


前端修改(JavaScript)

将字节数组转为Base64字符串,封装到JSON对象中发送,并设置正确的请求头:

// 将字节数组转为Base64字符串
const base64Str = btoa(String.fromCharCode(...new Uint8Array(byteArray)));

$.ajax({
  url: armd.scieldan.server + "/detachedSignFile/",
  timeout: 120000,
  type: "POST",
  contentType: "application/json", // 明确指定JSON类型
  data: JSON.stringify({ fileBytes: base64Str }), // 封装为JSON对象
  success: function(response) {
    console.log("Sign: " + response);
  },
  error: function() {
    console.log("error");
  }
});

后端修改(Java)

读取请求体的JSON字符串,解析出Base64字段后解码为字节数组:

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.io.IOUtils;

public void handle(HttpExchange httpExchange) throws IOException {
    httpExchange.getResponseHeaders().set("Content-Type", "application/json");
    
    // 读取请求体的JSON字符串
    String requestBodyStr = IOUtils.toString(httpExchange.getRequestBody(), "UTF-8");
    ObjectMapper mapper = new ObjectMapper();
    JsonNode jsonNode = mapper.readTree(requestBodyStr);
    
    // 提取Base64字符串并解码为字节数组
    String base64Str = jsonNode.get("fileBytes").asText();
    byte[] receivedBytes = Base64.decodeBase64(base64Str);
    
    // 后续处理receivedBytes...
}

注意事项

  • 确保后端依赖jackson-databind(用于JSON解析)和commons-codec(用于Base64解码),需在项目依赖中添加对应组件。
  • 若前端的byteArray是ArrayBuffer类型,需先转为Uint8Array再处理,示例中已包含该转换逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 20:25:23