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

如何在Java版Azure Function Apps中获取multipart form data?

在Java版Azure Function Apps中解析Multipart Form Data的实现方案

一、添加必要依赖

在你的Azure Function项目的pom.xml中添加Apache Commons相关依赖,用于解析multipart数据:

<dependencies>
    <!-- 项目原有依赖 -->
    <dependency>
        <groupId>commons-fileupload</groupId>
        <artifactId>commons-fileupload</artifactId>
        <version>1.5</version>
    </dependency>
    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.15.1</version>
    </dependency>
</dependencies>

二、修改函数代码解析Multipart数据

直接在函数参数中注入HttpServletRequest,通过Apache Commons FileUpload工具类解析请求中的multipart内容,分离文件和普通表单字段:

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.IOUtils;

import jakarta.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Optional;

import com.microsoft.azure.functions.*;
import com.microsoft.azure.functions.annotation.AuthorizationLevel;
import com.microsoft.azure.functions.annotation.HttpTrigger;

public class MultipartHandlerFunction {
    public HttpResponseMessage run(
            @HttpTrigger(
                name = "req",
                methods = {HttpMethod.POST},
                authLevel = AuthorizationLevel.ANONYMOUS)
                HttpRequestMessage<Optional<String>> request,
            HttpServletRequest servletRequest,
            final ExecutionContext context) {
        
        context.getLogger().info("Java HTTP trigger processed a multipart request.");

        // 校验请求是否为multipart类型
        if (!ServletFileUpload.isMultipartContent(servletRequest)) {
            return request.createResponseBuilder(HttpStatus.BAD_REQUEST)
                    .body("请求格式错误,需为multipart/form-data类型")
                    .build();
        }

        // 初始化文件上传处理器
        DiskFileItemFactory factory = new DiskFileItemFactory();
        ServletFileUpload upload = new ServletFileUpload(factory);

        try {
            // 解析所有multipart项
            List<FileItem> items = upload.parseRequest(servletRequest);
            
            for (FileItem item : items) {
                if (!item.isFormField()) {
                    // 处理上传的文件
                    String fileName = item.getName();
                    long fileSize = item.getSize();
                    InputStream fileStream = item.getInputStream();
                    
                    context.getLogger().info(String.format("收到文件:%s,大小:%d字节", fileName, fileSize));
                    
                    // 示例:将文件内容转为字节数组,可根据需求写入存储或处理
                    byte[] fileContent = IOUtils.toByteArray(fileStream);
                    
                    // 清理资源
                    fileStream.close();
                    item.delete(); // 删除临时文件
                } else {
                    // 处理普通表单字段
                    String fieldName = item.getFieldName();
                    String fieldValue = item.getString("UTF-8"); // 指定编码避免乱码
                    context.getLogger().info(String.format("表单字段'%s'值:%s", fieldName, fieldValue));
                }
            }
            
            return request.createResponseBuilder(HttpStatus.OK)
                    .body("Multipart数据处理完成")
                    .build();
        } catch (FileUploadException | IOException e) {
            context.getLogger().severe("处理multipart请求出错:" + e.getMessage());
            return request.createResponseBuilder(HttpStatus.INTERNAL_SERVER_ERROR)
                    .body("处理multipart数据失败")
                    .build();
        }
    }
}

三、关键注意事项

  • 请求校验:通过ServletFileUpload.isMultipartContent过滤非multipart类型请求,避免无效处理。
  • 资源清理:处理完文件后必须关闭输入流并删除临时文件,防止资源泄漏。
  • 编码处理:读取表单字段时指定UTF-8编码,避免中文等非ASCII字符乱码。

内容的提问来源于stack exchange,提问作者ng.newbie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 03:30:56