Spring WebFlux - bodyType=org.springframework.web.multipart.MultipartFile 不支持内容类型“application/xml”

Posted

技术标签:

【中文标题】Spring WebFlux - bodyType=org.springframework.web.multipart.MultipartFile 不支持内容类型“application/xml”【英文标题】:Spring WebFlux - Content type 'application/xml' not supported for bodyType=org.springframework.web.multipart.MultipartFile 【发布时间】:2019-09-02 02:20:36 【问题描述】:

我正在使用spring-webflux 并想上传文件.... 仅使用spring-web 一切都很好,但是当涉及webflux 时我不知道出了什么问题。

注意区别......我正在使用:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-webflux</artifactId>
    </dependency>

假设我们有以下 @RestController ,对于 Spring Web 它就像魅力一样:

@PostMapping(value = "/uploadFile")
public Response uploadFile(@RequestParam("file") MultipartFile file) 


现在尝试对Spring-webflux 进行相同操作会产生以下错误:


    "timestamp": "2019-04-11T13:31:01.705+0000",
    "path": "/upload",
    "status": 400,
    "error": "Bad Request",
    "message": "Required MultipartFile parameter 'file' is not present"


我从random*** 问题中发现我必须使用@RequestPart 而不是@RequestParam,但现在我收到以下错误,我不知道为什么会发生这种情况?

错误如下:


    "timestamp": "2019-04-11T12:27:59.687+0000",
    "path": "/uploadFile",
    "status": 415,
    "error": "Unsupported Media Type",
    "message": "Content type 'application/xml' not supported for bodyType=org.springframework.web.multipart.MultipartFile"

即使使用.txt 文件也会产生相同的错误:


    "timestamp": "2019-04-11T12:27:59.687+0000",
    "path": "/uploadFile",
    "status": 415,
    "error": "Unsupported Media Type",
    "message": "Content type 'application/xml' not supported for bodyType=org.springframework.web.multipart.MultipartFile"

下面是Postman Configuration,它非常简单,我只是用一个帖子请求调用并且只修改了如图所示的正文。

顺便说一句,我也在 application.properties 上添加了所需的属性:)

## MULTIPART (MultipartProperties)
# Enable multipart uploads
spring.servlet.multipart.enabled=true
# Threshold after which files are written to disk.
spring.servlet.multipart.file-size-threshold=2KB
# Max file size.
spring.servlet.multipart.max-file-size=200MB
# Max Request Size
spring.servlet.multipart.max-request-size=215MB

【问题讨论】:

What is http multipart request?的可能重复 好吧,如果您查看答案,您会发现多部分的内容类型不能是 application/xml。就是这样。 @JEY 对于 text/plain 或我添加的任何文件,我都会遇到同样的错误,先生 :) 我认为您的请求有问题,因为我创建了一个示例项目gist.github.com/Julien-Eyraud/4a9384e11372004d0218a9e8a961108a,它可以正常工作 @JEY 我遵循了本教程 :) callicoder.com/… 但他正在使用 spring-web 我们正在使用 spring-webflux 并且所有问题都存在。我对spring-web 使用了相同的请求并且它有效:'( 我整天都在为它解决问题:( 【参考方案1】:

作为documentationsais:

DefaultServerWebExchange 使用配置的HttpMessageReader&lt;MultiValueMap&lt;String, Part&gt;&gt; 将 multipart/form-data 内容解析为 MultiValueMap。

要以流方式解析多部分数据,您可以改用从 HttpMessageReader 返回的 Flux。

用几句话你需要做这样的事情:

    @RequestMapping(path = "/uploadFile", method = RequestMethod.POST, 
        consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    public Flux<String> uploadFile(@RequestBody Flux<Part> parts) 
    //...
    

看看这个example

【讨论】:

谢谢 Nikolay,我对此很陌生...我如何从零件内部获取文件 :)? 看this example 您已经了解到从 web 切换到 webflux 不仅仅是更改 artifactId ;) 尼古拉我有一个问题?这对于 1 GB 文件是否可以正常工作,否则服务会崩溃? Webflux 非常适合上传/下载大文件。几个月前有some issues 用于流式传输非常大的文件,但我认为它现在已修复。这一切都取决于如何使用。

以上是关于Spring WebFlux - bodyType=org.springframework.web.multipart.MultipartFile 不支持内容类型“application/xml”的主要内容,如果未能解决你的问题,请参考以下文章

Spring Webflux - 03 Webflux编程模型

Spring Webflux - 03 Webflux编程模型

Spring-WebFlux使用,一文带你从0开始学明白Spring-WebFlux,学明白响应式编程

Spring WebFlux

MSMQ BodyType 整数分配

Spring @Async 与 Spring WebFlux