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

在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库解析(推荐)

  1. 添加Maven依赖:
<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.5</version>
</dependency>
  1. 修改函数代码实现解析:
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分割内容:

  1. 从请求头Content-Type中提取boundary值(格式为boundary=xxx,取xxx部分)
  2. 将reqBody按--${boundary}分割成数组
  3. 遍历数组找到包含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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 15:24:23