如何在 MultipartFormData 的 REST API 中使用内容类型为 message/rfc822 的文件?

Tim*_*Tim 8 javascript resteasy mime-types axios quarkus

在我的 Vue 应用程序中,我有这个文件输入

<input type="file" multiple @input="handleFileInput" />
Run Code Online (Sandbox Code Playgroud)

所选文件将传递给我的此上传方法:

 public async uploadFiles(file: File) {

    [...]
    const formData = new FormData();
    formData.append('fileName', file.name);
    formData.append('file', file);
    [...]
    await axios.post('my-upload-url', formData);    
}
Run Code Online (Sandbox Code Playgroud)

发送前的js日志:

在此输入图像描述

发送后的网络日志:

在此输入图像描述

我的 Resteasy 控制器回答:

@POST
@Transactional
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response uploadMultipartData(@MultipartForm @Valid MyDto dto) {
 // dto.file -> my file
}
Run Code Online (Sandbox Code Playgroud)

DTO:

public class MyDto {
    @NotNull
    @FormParam("file")
    @PartType(MediaType.APPLICATION_OCTET_STREAM)
    public InputStream file;
}
Run Code Online (Sandbox Code Playgroud)

传输其他文件类型(pdf、png、jpg、mp3...)时,文件按预期位于 DTO 的 InputStream 中。但是,当文件是 .eml 文件时,InputStream 为 null。

更新:将文件从 text.eml 重命名为 test.txt 时,上传有效。

为什么?

换句话说,如何在 REST Api 中使用内容类型为 message/rfc822 的文件?我是否需要一个单独的方法来接受此特定媒体类型?

小智 1

因此,这肯定与您的服务器处理上传文件的方式有关。application/octet-stream只是代表一个通用/未知的二进制文件。来自 RFC 2046 \xc2\xa7 4.5.1:

\n
\n

“八位字节流”子类型用于指示主体包含任意二进制数据。

\n
\n

大多数应用程序会尝试通过查看文件的扩展名来确定文件 mimetype,但如果扩展名未知,那么将很难确定文件的 mimetype。文件eml只是一个文本文件,这解释了为什么将扩展名更改为txt可以正常工作。验证这一点的最简单方法是获取一个简单的txt文件并将其扩展名更改为unknown(例如)并尝试上传该文件。

\n

我已经设置了一个复制完全相同场景的示例,在这种情况下,服务器读取文件内容没有问题。

\n