如何通过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
相关产品推荐
相关产品推荐

