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

