Spring Boot 多部分/相关 mime 类型支持

2023-12-06

我需要使用内容类型为多部分/相关的请求。请求将包含图像、json 负载和二进制内容。我试图找到一些关于如何在 Spring boot 应用程序中处理此类请求的示例,我找到了一些关于如何处理 multipart/form-data 请求的参考,但没有与 multipart/相关 mime 类型相关的内容。

请求是这样的:

POST /upload
Content-Type: multipart/related; boundary="123asdf234"
--123asdf234
Content-Type: application/json; charset=UTF-8
Content-Disposition: form-data
{
    "json": "payload"

}
—-123asdf234
Content-Type: application/zip
Content-Disposition: file-data; filename="some.zip"; size=123456;
<binary-attachment-content>
—-123asdf234
Content-Type: image/png
Content-Disposition: file-data; filename="image1.png"; size=123456;
<binary-attachment-content>
—-123asdf234-—

有人可以告诉我如何在 Spring boot 应用程序中处理这个请求吗?我正在使用 JaxRS。


为了解决这个问题,我首先提到http://cxf.apache.org/docs/jax-rs-multiparts.html正确理解与 JAX-RS 相关的多部分/相关。接下来我参考了 Spring 文档JAX-RS并选择使用 Jersey 依赖来解决它。然后参考泽西岛文档我构建了以下测试项目:https://github.com/ShawnTuatara/stackoverflow-38838926。主要的例子是:

package ca.tuatara.stackoverflow;

import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

import org.glassfish.jersey.media.multipart.BodyPart;
import org.glassfish.jersey.media.multipart.FormDataParam;
import org.glassfish.jersey.media.multipart.MultiPart;
import org.glassfish.jersey.media.multipart.MultiPartFeature;
import org.glassfish.jersey.server.ResourceConfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.stereotype.Component;

@SpringBootApplication
public class Stackoverflow38838926Application {
    public static void main(String[] args) {
        SpringApplication.run(Stackoverflow38838926Application.class, args);
    }

    @Component
    public class JerseyConfig extends ResourceConfig {
        public JerseyConfig() {
            register(MultiPartFeature.class);
            register(MultipartHandler.class);
            register(MultipartPartsHandler.class);
        }
    }

    @Component
    @Path("/upload")
    @Consumes("multipart/*")
    @Produces("text/text")
    public class MultipartHandler {
        @POST
        public String upload(MultiPart request) {
            StringBuffer response = new StringBuffer();
            for (BodyPart part : request.getBodyParts()) {
                if (MediaType.APPLICATION_JSON_TYPE.isCompatible(part.getMediaType())) {
                    response.append(part.getEntityAs(JsonModel.class));
                } else if (MediaType.APPLICATION_XML_TYPE.isCompatible(part.getMediaType())) {
                    response.append(part.getEntityAs(XmlModel.class));
                }
                response.append(System.lineSeparator());
            }
            return response.toString();
        }
    }

    @Component
    @Path("/uploadParts")
    @Consumes("multipart/*")
    @Produces("text/text")
    public class MultipartPartsHandler {
        @POST
        public String upload(@FormDataParam("json") JsonModel json, @FormDataParam("xml") XmlModel xml) {
            return json + System.lineSeparator() + xml;
        }
    }
}

该测试展示了如何发送多部分请求。我保留了一些调试日志记录,以便您可以准确地看到测试运行时线路上发生的情况。

您的原始 POST 有效负载存在一些问题,导致无法正确解析它。内容的标题和内容之间必须有换行符。如果您没有为 Content-Disposition 提供“name”属性,则只能使用第一个示例(“/upload”)。如果您确实命名了表单数据,那么您可以使用第二个示例(“/uploadParts”)。我没有使用图像或文件上传来执行此示例,但如果您阅读 Jersey 多部分页面,您会发现在请求方法上添加该参数输入非常简单。

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

Spring Boot 多部分/相关 mime 类型支持 的相关文章

随机推荐

  • Accumulo 支持聚合吗?

    我是 Accumulo 的新手 我知道我可以编写 Java 代码来使用 Hadoop 和 MapReduce 扫描 插入 更新和删除数据 我想知道的是 Accumulo 中是否可以进行聚合 我知道在MySql中我们可以使用groupby o
  • Windows 中用于生物识别身份验证的凭据提供程序

    我有一个定制的基于 USB 的指纹识别设备 如何将设备上的指纹与 Windows 计算机的用户关联起来 使用 CredentialProvider 首先 我希望在指纹扫描时自动登录 而不提示输入用户名 密码 我意识到应该有一些注册过程来将指
  • Chome 扩展:将 chrome.storage 数据从后台脚本发送到 popup/contentscript

    如标题中所述 我正在尝试编写一个后台脚本 该脚本将侦听来自 popup js 或 contentscript js 的加载请求 当它接收到负载时 它会获取 chrome storage local 的内容 执行一些数据处理 for 循环 并
  • 如何使用 Pharo 每 60 秒刷新一次会话并将其显示在成绩单上?

    a b a ZnClient new a get http cloud storage com login a formAt username put jom formAt password put mypass post get http
  • 自定义或可重复使用的 HTML 组件

    我们可以在 HTML 中创建自定义或可重用的组件吗 我的页面具有帐户搜索功能 该功能是使用 HTML JS jQuery 代码实现的 我的页面由不同地方的帐户搜索组成 功能同样困难 每次使用时 只有 div 的 ID 会发生变化 那么我们能
  • 控制中心中的“播放/暂停下一个/上一个”按钮显示为灰色

    在我的应用程序中 播放是从控制中心控制的 当在 AVPlayer 中进行播放时 此时播放控件在控制中心工作正常 我正在加载带有其他流 URL 的 Web 视图 一旦流再次完成 我就开始从 AVPlayer 播放 此后 控制中心的播放控件将显
  • javascript Thrift 客户端挂起

    我在 javascript 中有以下 Thrift 客户端代码
  • JAXB 解组 XML 字符串 - 循环遍历所有标签

    我是 Java 编程新手 正在解组以下 XML 字符串 我的任务是获取客户的姓名 这个字符串 我已经为一位客户做过 我需要获取所有客户姓名 我需要有关循环部分的帮助 这适用于一位客户 我的Java代码 XMLInputFactory xif
  • Sprite Kit - iOS 7.1 更新后由于缩放而导致对象碰撞

    没有问题 但在 iOS 7 1 更新后 物体碰撞 2pipes 的间隙 之前有人说过 这可能是因为 yScale 但我找不到解决方案 一些代码 Pipe pipe Pipe alloc initWithImageNamed pipeImag
  • @onclick="(() => SomeMethod(参数))"

    我正在研究 Blazor 偶然发现了这个表达式 onclick gt SomeMethod parameter 我无法在任何地方找到 谷歌这个 我猜 lambda 表达式实际上在做什么 谁能帮我解释一下这部分 gt 以及为什么使用它以及在哪
  • 如何使用 Webpack 2 获取数据属性内的图像?

    我在用 pug我的 HTML 和标准模板src我的图像上的属性如下所示 img src images image 当我跑步时webpack p 任何定义在src我的图像被 Webpack 找到并放入我的dist目录 这正是我所期望发生的事情
  • asp.net 树形视图复选框选择

    我有几个父节点 每个父节点都包含一个子节点列表 我的显示复选框设置为全部 我的问题 在客户端 当我检查父节点时 如何在不进行回发或使用 ajax 的情况下检查所有子节点 Regards tv Attributes Add onclick O
  • 如何在 CakePHP 中使用 TranslateBehavior?

    cakephp org 上没有文档 我无法在 google 上找到文档 请给我链接一些文档或提供一份 翻译行为是 CakePHP 的另一个非常有用但文档很少的功能 我已经在多语言网站上实施了几次 并取得了一定的成功 遵循以下原则 首先 翻译
  • 如何使用 powershell 中的 psexec 启用 winrm

    我编写了一个 powershell 脚本来远程执行一些操作系统验证 但是当远程服务器未使用 winrm 启用时 我收到以下消息 那么如何强制 winrm 使用 psexec 远程启用 Connecting to remote server
  • 当一切都正确加载和注释时,setText() 出现 NullPointer 异常

    我在尝试调用时收到以下异常setText 在我带注释的标签上 来自start 方法 我见过类似的问题 但它对那个人不起作用的原因是因为他的标签没有注释 而我的是 java lang NullPointerException at io gi
  • Android 中图片的存储位置

    我已将所有图像从 mipmap 文件夹移至可绘制文件夹 因为据说 mipmap 文件夹仅用于应用程序图标来启动应用程序Mipmap 与可绘制文件夹 这个答案得到了841个赞 但是 当我现在想要启动我的应用程序时 我收到一条错误消息 FATA
  • Python - 如何查找 if 语句中哪个条件为真?

    我有一个 if 语句有很多条件 例如 if 0 gt 1 or 9 lt 10 or 2 1 print Hello World 所以我想知道哪个是让 if 语句继续打印 hello world 的正确条件 不使用另一个 if 语句或 el
  • jenkins 未将“节点”识别为内部或外部命令错误

    我正在尝试在 jenkins v1 592 的帮助下设置持续代码集成 我有一个 android 混合代码 我正在尝试用 jenkins 构建它 我已经为ANT HOME JAVA HOME ANDROID HOME设置了环境变量 然后分别添
  • 如何编码并传递(对 std::vector 的引用)?

    我似乎无法弄清楚这一点 class Tree Node root vector dict class Node vector dict char cargo Node left Node right 我希望 Tree 的每个实例都有自己的字
  • Spring Boot 多部分/相关 mime 类型支持

    我需要使用内容类型为多部分 相关的请求 请求将包含图像 json 负载和二进制内容 我试图找到一些关于如何在 Spring boot 应用程序中处理此类请求的示例 我找到了一些关于如何处理 multipart form data 请求的参考