在Java Azure Function中如何通过HttpRequestMessage获取纯文件内容
问题:Java Azure Function中如何通过HttpRequestMessage获取form-data中的纯文件内容?
我正在开发一个用于上传文件或图片的Java Azure Function,代码如下:
@FunctionName("upload") public HttpResponseMessage uploadDocuments(@HttpTrigger(name = "req", methods = { HttpMethod.POST }, authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<String> request,final ExecutionContext context){ // 获取请求体 String reqBody = request.getBody().get(); }
目前获取到的reqBody包含form-data头部信息,内容如下:
----------------------------493134179411177203860920 Content-Disposition: form-data; name="myfile[]"; filename="newone.json" Content-Type: application/json { "name":"jhon" "age":23 } ----------------------------493134179411177203860920--
我需要提取的实际文件内容是:
{ "name":"jhon" "age":23 }
请问是否可以通过HttpRequestMessage在Java中获取不含头部的纯内容?
回答
可以获取,但需要解析multipart/form-data格式的请求体来剥离头部。推荐使用成熟的第三方库处理,避免手动切割的潜在问题,具体方案如下:
方案1:使用commons-fileupload库解析(推荐)
- 添加Maven依赖:
<dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.5</version> </dependency>
- 修改函数代码实现解析:
import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.RequestContext; import org.apache.commons.fileupload.servlet.ServletFileUpload; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.nio.charset.StandardCharsets; import java.util.List; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; @FunctionName("upload") public HttpResponseMessage uploadDocuments(@HttpTrigger(name = "req", methods = {HttpMethod.POST}, authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Optional<String>> request, ExecutionContext context) { try { // 获取请求体输入流 String body = request.getBody().orElse(""); InputStream inputStream = new ByteArrayInputStream(body.getBytes(StandardCharsets.UTF_8)); // 初始化文件上传解析器 ServletFileUpload upload = new ServletFileUpload(); // 适配Azure Function请求到库所需的RequestContext RequestContext requestContext = new AzureRequestContext(inputStream, request.getHeaders()); // 解析请求获取文件项 List<FileItem> items = upload.parseRequest(requestContext); for (FileItem item : items) { if (!item.isFormField()) { // 提取纯文件内容 String fileContent = item.getString(StandardCharsets.UTF_8.name()); context.getLogger().info("提取到的文件内容:" + fileContent); return request.createResponseBuilder(HttpStatus.OK).body("文件内容提取成功:" + fileContent).build(); } } return request.createResponseBuilder(HttpStatus.BAD_REQUEST).body("未检测到上传的文件").build(); } catch (Exception e) { context.getLogger().severe("解析请求失败:" + e.getMessage()); return request.createResponseBuilder(HttpStatus.INTERNAL_SERVER_ERROR).body("解析请求出错").build(); } } // 自定义RequestContext实现类,适配Azure Function请求 class AzureRequestContext implements RequestContext { private final InputStream inputStream; private final HttpHeaders headers; public AzureRequestContext(InputStream inputStream, HttpHeaders headers) { this.inputStream = inputStream; this.headers = headers; } @Override public String getCharacterEncoding() { return StandardCharsets.UTF_8.name(); } @Override public int getContentLength() { return headers.getContentLength().intValue(); } @Override public String getContentType() { return headers.getContentType().toString(); } @Override public InputStream getInputStream() { return inputStream; } }
方案2:手动切割字符串(不推荐,仅作参考)
如果不想引入第三方库,可以手动基于boundary分割内容:
- 从请求头
Content-Type中提取boundary值(格式为boundary=xxx,取xxx部分) - 将
reqBody按--${boundary}分割成数组 - 遍历数组找到包含
filename的块,去掉块中的头部行(直到遇到空行),剩下的就是纯文件内容
示例代码片段:
String contentType = request.getHeaders().getContentType().toString(); String boundary = contentType.split("boundary=")[1]; String[] parts = reqBody.split("--" + boundary); for (String part : parts) { if (part.contains("filename")) { // 分割头部和内容,空行是分隔符 String[] contentParts = part.split("\r\n\r\n", 2); if (contentParts.length == 2) { String fileContent = contentParts[1].trim(); // 去掉末尾的多余分隔符 fileContent = fileContent.replaceAll("\r\n--$", ""); context.getLogger().info("提取到的文件内容:" + fileContent); } } }
手动切割容易因不同客户端的换行符、边界符格式差异出错,仅适合简单场景。
内容的提问来源于stack exchange,提问作者Shiva Rena
相关产品推荐
相关产品推荐

