在 Java 中的 AWS Lambda 上解析 multipart/form-data Body

2023-11-21

我是 AWS Lambda 新手,我正在尝试实现一个 Lambda 函数,该函数接收包含编码为 multipart/form-data 的数据的 POST 请求。该消息是使用 Lambda 代理集成通过 API 网关接收的,并且正文在到达 Lambda 函数时以 Base64 进行编码。手动解码后,我看到它包含一个多部分主体,如下所示:

-----WebKitFormBoundary3EZ0C3tbP2JpAmz4
Content-Disposition: form-data; name="param1"

value1
-----WebKitFormBoundary3EZ0C3tbP2JpAmz4
Content-Disposition: form-data; name="param2"

value2
------WebKitFormBoundary3EZ0C3tbP2JpAmz4
Content-Disposition: form-data; name="myfile"; filename="ivr.png"
Content-Type: image/png

PNG
... [binary stuff]
------WebKitFormBoundary3EZ0C3tbP2JpAmz4--

我需要的是在 java 8 中解析此消息,以便我可以访问各个部分。我设法使用 +javax.mail.Multipart+ 对象来做到这一点,但似乎我无法访问部件的“名称”属性,因此我无法区分相同类型的元素,例如“参数1”和“参数2”。 我相信这可能与该类用于解析电子邮件的事实有关...... 是否有另一种方法可以在 lambda 函数内解析这个多部分主体?这是我必须解析它的代码(base64 是包含主体的字符串):

DataSource source = new ByteArrayDataSource(new ByteArrayInputStream(Base64.decodeBase64(base64)), "multipart/mixed");
MimeMultipart mp = new MimeMultipart(source);

如果您能提供任何帮助,我将不胜感激。


好吧,这绝对不是ideal解决方案,但我能够完成这项工作。

Problem

实际上有很多库可以解析多部分表单数据。实际问题是所有库都依赖javax.servlet包——最重要的是HttpServletRequest类(还有更多)。

由于我们无法访问javax.servlet在AWS Lambda环境中打包类,我的解决方案是解决这个问题。


Solution

  1. 下载javax.servlet 来自 GitHub 的包并将其添加到您的 lambda 函数中。请看下图 - 你可以看到我的班级MultipartFormDataTest在我的包裹内com...我也有javax.servlet包在同一个 Java 模块中。

Javax Servlet Package added to Lambda Module

  1. 一旦我们这样做了,我们就可以使用一个或多个库来为我们完成所有工作。我发现可以解析文件内容的最好的库是 Delight FileUpload -https://mvnrepository.com/artifact/org.javadelight/delight-fileupload.

  2. 添加该库后,可以使用以下方法getFilesFromMultipartFormData()将返回ArrayList<File>其中列表中的每个项目代表一个File这是在请求中发送的。

/**
 * @param context context
 * @param body this value taken from the `request.getBody()`
 * @param contentType this value is taken from `request.headers().get("Content-Type")`
 * @return List of File objects
 */
private List<File> getFilesFromMultipartFormData(Context context, String body, String contentType) {
    ArrayList<File> files = new ArrayList<>();
    List<FileItem> fileItems = FileUpload.parse(body.getBytes(StandardCharsets.UTF_8), contentType);

    for(FileItem fileItem : fileItems) {
        if(fileItem == null) {
            continue;
        }

        logger.log("fileItem name: " + fileItem.getName());
        logger.log("fileItem content-type: " + fileItem.getContentType());
        logger.log("fileItem size: " + fileItem.getSize());

        // Note: instead of storing it locally, you can also directly store it to S3 for example
        try {
            // I'm setting the extension to .png but you can look at the fileItem.getContentType()
            // to make sure it is an image vs. pdf vs. some other format
            File temp = File.createTempFile(fileItem.getName(), ".png");
            Files.copy(fileItem.getInputStream(), temp.toPath(), StandardCopyOption.REPLACE_EXISTING);
            files.add(temp);
        } catch (Exception e) {
            continue;
        }
    }

    return files;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Java 中的 AWS Lambda 上解析 multipart/form-data Body 的相关文章

随机推荐

  • 向每个团队成员发送成功自动化构建的通知

    我们只是将 Visual Studio Team Services 集成为我们的新工作流程 并在提交到 master 的基础上设置自动构建 目前 承诺掌握并发起新构建的个人将在构建失败或成功时收到通知电子邮件 我们以为我们都会收到通知 但事
  • MVVM WPF ComboBox SelectedItem 绑定未在数据网格内激活

    在数据网格内操作时 我一直在努力保存组合框选定的值 当我制作没有数据网格的测试解决方案时 一切正常 上下文是与相关国家的人名 国家 地区存储在 xml 文件中 这是初始视图的快照 您可以在此处看到PersonList xaml 的重要部分
  • Java 包与 C++ 库

    In Java 有一种叫做package Does library in C 代表相同的含义 特别是在包含相关子句和使用受保护成员等术语中 Thanks 一个事物有不同的维度packageJava 中的意思 作为一个区分内部类名称与其他包中
  • 设计模式名称:从类级别获取类

    特别是在单元测试中 我们使用这种 设计模式 我称之为 从类级别获取类 框架测试 py class FrameWorkHttpClient object class FrameWorkTestCase unittest TestCase Su
  • “长度不能小于零。”在空白行上

    即使我注释掉发生错误的行 我仍然收到上述错误消息 知道是什么原因造成的吗 我尝试用测试值重写这些行 但仍然遇到相同的错误 这在调试模式下工作得很好 只有在部署中才会出现 原始代码 Line 21 string domain username
  • html5 画布中的运动 jpeg

    我正在尝试将运动 jpeg mjpeg 流 来自网络摄像头 包装到 html5 画布中 我知道 Safari 和 Chrome 对 mjpeg 具有本机支持 因此我可以将其放入img使其发挥作用 我想将它包裹在画布中的原因是我想对其进行一些
  • 设置对话框进度

    我有一个异步任务 在执行任务时不会添加百分比 它始终保持在 0 0 100 这是我的代码 private class getAppInfo extends AsyncTask
  • Django-filter 按相关字段过滤

    我有两张桌子 class Writer models Model name model CharField class Article models Model name model CharField writer model Forei
  • 如何在 AngularJS 页面中接收 POST 请求?

    我们制作了一个 AngularJS 应用程序 用户打开一个 URL xyz com booking 填写表格 然后选择一些要购买的商品 之后 用户单击 购买 按钮并离开该站点前往支付网关站点 付款成功后 支付网关通过在回调 URL xyz
  • 如何在Python中生成具有重复数字的随机列表

    所以几天前我才开始用Python编程 现在 我正在尝试制作一个生成随机列表的程序 然后选择重复元素 问题是 我的列表中没有重复的数字 这是我的代码 import random def generar listas numeros rango
  • 修改传递给脚本的参数 (Bash)

    我已经在谷歌上寻找了很长一段时间 但找不到任何符合我需要 想要做的事情 我的目标是编写一个带有两个参数的脚本 它将搜索第一个参数 这是一个列表 并检测第二个参数是否已在其中 例如 列表 bin foo bin random 随机 添加到列表
  • 无法理解带有两个变量的for循环[重复]

    这个问题在这里已经有答案了 当我在具有不同条件的 for 循环中使用两个变量时 我在下面使用了两个条件i lt 3 j lt 2for 循环始终执行 直到第二个条件失败 include
  • YARN 上 Spark 的性能问题

    我们正在尝试在纱线上运行我们的火花集群 我们遇到了一些性能问题 特别是与独立模式相比 我们有一个由 5 个节点组成的集群 每个节点都有 16GB RAM 和 8 个核心 我们在yarn site xml中将最小容器大小配置为3GB 最大容器
  • 按周/月间隔的日期范围分组

    我正在使用 MySQL 并且有下表 clicks int period date 我希望能够生成这样的报告 其中月经周期是在过去 4 周内完成的 period clicks 1 7 7 5 1000 25 6 31 7 18 6 24 6
  • 在 IOS 上使用 AFNetworking 流式传输 JSON

    使用 AFNetworking 从流式 JSON API 接收数据的最优雅的方式是什么 AFNetworking 为从 JSON API 接收非流数据提供了出色的支持 但我找不到任何流 JSON 的示例 AFNetworking 没有内置的
  • Safari 无法在 Rails 应用程序中加载 HTML5 视频

    我有一个 Rails 应用程序 我正在尝试使用以下标记播放 HTML5 视频 不起作用
  • PHP SoapClient - 具有相同键的多个属性

    我正在使用 SoapClient 尝试为该规范生成一些东西
  • 是否可以访问位于另一个项目中的 MVC 视图?

    我想将我的 MVC 项目分成几个项目 首先 我创建了两个项目Front and Views The Front项目是一个包含控制器和模型的 Web 应用程序 The Views项目是一个类库项目 仅包含视图 我的问题是如何让控制器调用位于V
  • jks 或 pkcs12:我应该使用哪一个来签署 Google Play 商店的 apk?

    Android Studio 3 5 3 在创建新的密钥存储后 建议我使用以下命令对其进行转换 keytool importkeystore srckeystore path myKeyStore jks destkeystore path
  • 在 Java 中的 AWS Lambda 上解析 multipart/form-data Body

    我是 AWS Lambda 新手 我正在尝试实现一个 Lambda 函数 该函数接收包含编码为 multipart form data 的数据的 POST 请求 该消息是使用 Lambda 代理集成通过 API 网关接收的 并且正文在到达