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

Quarkus中如何将InputStream转换为Multipart Form对象?

问题描述

我已经在应用中集成了SendGrid的Inbound Parse功能,当前资源类代码如下:

@POST
@Produces(MediaType.TEXT_PLAIN)
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Uni<Response> consumeMail(@Context HttpHeaders headers,
                                 InputStream inputStream) throws IOException {
    log.info("Received new email");
    log.info("Request headers");
    try (inputStream) {
        var bytes = inputStream.readAllBytes();
        log.infof("Data length %s", bytes.length);
        var mail = mailProcessService.saveMail(bytes);
        // How to convert bytes array to EmailFormData?
    }
    return Uni.createFrom().item(Response.accepted().build());
}

目前我不清楚如何在Quarkus中将InputStream转换为multipart/form-data类型的EmailFormData对象,请问该操作是否可行?相关实体类代码如下:

public class EmailFormData {
    @FormParam("dkim")
    @PartType(MediaType.TEXT_PLAIN)
    public String dkim;

    @FormParam("email")
    @PartType(MediaType.TEXT_PLAIN)
    public String email;

    @FormParam("to")
    @PartType(MediaType.TEXT_PLAIN)
    public String to;

    @FormParam("from")
    @PartType(MediaType.TEXT_PLAIN)
    public String from;
}
解决方案

完全可行,而且Quarkus基于JAX-RS规范,已经提供了自动绑定multipart/form-data到实体类的能力,不需要手动处理InputStream和字节数组,具体步骤如下:

  • 确认依赖到位
    先确保项目引入了Quarkus的multipart支持依赖:
    Maven(pom.xml):

    <dependency>
        <groupId>io.quarkus</groupId>
        <artifactId>quarkus-resteasy-multipart</artifactId>
    </dependency>
    

    Gradle(build.gradle):

    implementation 'io.quarkus:quarkus-resteasy-multipart'
    
  • 修改资源方法参数
    直接把InputStream替换为EmailFormData作为方法参数,框架会自动解析multipart请求并填充实体类字段:

    @POST
    @Produces(MediaType.TEXT_PLAIN)
    @Consumes(MediaType.MULTIPART_FORM_DATA)
    public Uni<Response> consumeMail(@Context HttpHeaders headers,
                                     EmailFormData emailFormData) {
        log.info("Received new email");
        log.info("Request headers");
        // 直接使用实体类中的字段
        log.info("From: {}", emailFormData.from);
        log.info("To: {}", emailFormData.to);
        log.info("DKIM: {}", emailFormData.dkim);
        log.info("Raw email content: {}", emailFormData.email);
        
        // 调用业务逻辑处理
        mailProcessService.saveMail(emailFormData);
        
        return Uni.createFrom().item(Response.accepted().build());
    }
    
  • 实体类优化(可选)
    可以把实体类的公共字段改为私有,再添加getter/setter方法,符合Java编码规范:

    public class EmailFormData {
        @FormParam("dkim")
        @PartType(MediaType.TEXT_PLAIN)
        private String dkim;
    
        @FormParam("email")
        @PartType(MediaType.TEXT_PLAIN)
        private String email;
    
        @FormParam("to")
        @PartType(MediaType.TEXT_PLAIN)
        private String to;
    
        @FormParam("from")
        @PartType(MediaType.TEXT_PLAIN)
        private String from;
    
        // getter和setter方法
        public String getDkim() { return dkim; }
        public void setDkim(String dkim) { this.dkim = dkim; }
        public String getEmail() { return email; }
        public void setEmail(String email) { this.email = email; }
        public String getTo() { return to; }
        public void setTo(String to) { this.to = to; }
        public String getFrom() { return from; }
        public void setFrom(String from) { this.from = from; }
    }
    

如果确实需要手动解析InputStream(不推荐,框架的自动绑定已经足够稳定),可以使用Apache Commons FileUpload或者JAX-RS的MultipartFormDataInput手动处理,但这种方式冗余且容易出错,优先用上面的自动绑定方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 07:54:26