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

如何在REST API的MultipartFormData中接收message/rfc822类型的.eml文件

问题原因

  • 核心问题出在DTO的@PartType注解配置:你固定指定了该字段接收的媒体类型为MediaType.APPLICATION_OCTET_STREAM,但.eml格式文件的默认MIME类型为message/rfc822。浏览器通过FormData上传文件时,会自动根据文件后缀识别MIME类型,给对应part设置Content-Type: message/rfc822,Resteasy的multipart参数注入逻辑会校验part实际媒体类型和注解声明类型是否匹配,匹配失败就不会给字段赋值,因此InputStream为null。
  • 将文件重命名为.txt后,浏览器识别的MIME类型变为文本类类型,Resteasy对这类类型和APPLICATION_OCTET_STREAM的校验规则更宽松,因此可以正常注入。

解决方案

不需要单独编写接口接收message/rfc822类型的文件,调整现有配置即可解决,可选方案如下:

方案1:后端修改PartType为通配类型(最简便)

直接将@PartType的值改为*/*,即可匹配任意MIME类型的文件part,兼容所有格式的文件上传:

public class MyDto {
    @NotNull
    @FormParam("file")
    @PartType("*/*")
    public InputStream file;
}

方案2:前端上传时强制指定MIME类型

在FormData追加文件时,手动指定文件的MIME类型为application/octet-stream,和后端现有配置匹配,不需要修改后端代码:

public async uploadFiles(file: File) {
    // 其他逻辑
    const formData = new FormData();
    formData.append('fileName', file.name);
    // 手动构造File对象,强制指定MIME类型覆盖浏览器默认识别结果
    const typeFixedFile = new File([file], file.name, { type: 'application/octet-stream' });
    formData.append('file', typeFixedFile);
    // 其他逻辑
    await axios.post('my-upload-url', formData);    
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 17:45:03