如何在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
相关产品推荐
相关产品推荐

