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

Java版AWS Lambda如何从APIGatewayProxyRequestEvent获取无请求头文件内容

解决AWS Lambda Java从APIGatewayProxyRequestEvent获取纯文件内容的问题

你遇到的这个情况很常见——当通过API Gateway发送multipart/form-data格式的文件请求时,API Gateway会把整个multipart请求(包括boundary分隔符、表单字段头信息)以base64编码的形式传给Lambda,所以直接调用getBody()拿到的是包含所有请求头的完整multipart内容,而不是纯文件本身。

下面是具体的解决步骤和代码示例:

1. 核心问题说明

API Gateway不会自动解析multipart/form-data请求,它只是把整个请求体编码成base64后传递给Lambda。因此我们需要在Lambda代码里手动解析这个multipart内容,从中提取出纯文件的字节流。

2. 添加必要依赖

我们需要用到Apache Commons的文件上传工具来解析multipart内容,以Maven项目为例,在pom.xml中添加以下依赖:

<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>

3. 编写解析代码

以下是完整的Lambda处理逻辑,可直接用于从APIGatewayProxyRequestEvent中提取纯文件内容:

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.RequestContext;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Base64;
import java.util.List;

public class FileUploadHandler {

    public String handleRequest(APIGatewayProxyRequestEvent apiGatewayProxyRequestEvent, Context context) {

        // 1. 确认请求体是base64编码格式(API Gateway默认对multipart请求做此处理)
        if (!apiGatewayProxyRequestEvent.isBase64Encoded()) {
            context.getLogger().log("Request body is not base64 encoded");
            return "Invalid request format";
        }

        try {
            // 2. 将base64编码的请求体解码为字节数组
            byte[] requestBodyBytes = Base64.getDecoder().decode(apiGatewayProxyRequestEvent.getBody());

            // 3. 构建RequestContext对象,供Commons FileUpload解析使用
            RequestContext requestContext = new RequestContext() {
                @Override
                public String getCharacterEncoding() {
                    return "UTF-8";
                }

                @Override
                public String getContentType() {
                    return apiGatewayProxyRequestEvent.getHeaders().get("Content-Type");
                }

                @Override
                public int getContentLength() {
                    return requestBodyBytes.length;
                }

                @Override
                public InputStream getInputStream() throws IOException {
                    return new ByteArrayInputStream(requestBodyBytes);
                }
            };

            // 4. 解析multipart格式的请求内容
            ServletFileUpload fileUpload = new ServletFileUpload();
            List<FileItem> fileItems = fileUpload.parseRequest(requestContext);

            // 5. 遍历解析结果,提取纯文件内容
            for (FileItem item : fileItems) {
                // 判断当前项是否为文件(而非普通表单字段)
                if (!item.isFormField()) {
                    String fileName = item.getName();
                    byte[] pureFileContent = item.get(); // 这里就是不含请求头的纯文件字节数组

                    // 打印文件基本信息(注意:PDF是二进制文件,直接转字符串打印会乱码,建议打印长度或直接上传到S3)
                    context.getLogger().log("Extracted file name: " + fileName);
                    context.getLogger().log("Pure file content length: " + pureFileContent.length);

                    // 这里可以添加上传到S3的逻辑,示例:
                    // s3Client.putObject("your-bucket-name", fileName, new ByteArrayInputStream(pureFileContent), new ObjectMetadata());
                }
            }

            return "File processed successfully";

        } catch (FileUploadException e) {
            context.getLogger().log("Failed to parse multipart request: " + e.getMessage());
            return "Error processing file";
        } catch (IllegalArgumentException e) {
            context.getLogger().log("Invalid base64 content: " + e.getMessage());
            return "Invalid request content";
        }
    }
}

关键注意事项

  • 二进制文件处理:像PDF这类二进制文件,不要直接将pureFileContent转成字符串打印,否则会出现乱码,应直接使用字节数组进行后续操作(比如上传到S3)。
  • base64编码校验:必须先检查isBase64Encoded(),避免对非base64内容进行解码导致错误。
  • 依赖打包:如果使用Maven打包Lambda,记得通过maven-shade-plugin将依赖一起打包,或者把这些依赖做成Lambda层,避免生成的部署包过大。

内容的提问来源于stack exchange,提问作者yuvanath

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 07:57:40