如何使Spring反应式Web MVC能够处理多部分文件?

如何使Spring反应式Web MVC能够处理多部分文件?,spring,spring-boot,multipartform-data,spring-webflux,Spring,Spring Boot,Multipartform Data,Spring Webflux,我试图在SpringBoot2.0应用程序中使用新的反应式WebMVC实现。我试图定义一个使用多部分文件但无法使其正常工作的方法:(-我总是得到一个415错误 一方面,我有一个包含以下请求映射的控制器: @RequestMapping(method=RequestMethod.POST,path=“/myPath/{param}/{param2}”,consumes=MediaType.MULTIPART\u FORM\u DATA\u VALUE) @应答器 公共Mono postFile(

我试图在SpringBoot2.0应用程序中使用新的反应式WebMVC实现。我试图定义一个使用多部分文件但无法使其正常工作的方法:(-我总是得到一个415错误

一方面,我有一个包含以下请求映射的控制器:

@RequestMapping(method=RequestMethod.POST,path=“/myPath/{param}/{param2}”,consumes=MediaType.MULTIPART\u FORM\u DATA\u VALUE)
@应答器
公共Mono postFile(
@RequestBody多部分文件数据,
@PathVariable(“param”)字符串param,
@PathVariable(“param2”)字符串param2,
@RequestHeader(name=HEADER\u DATE,required=false)@DateTimeFormat(pattern=DATE\u FORMAT)Instant Instant
){
返回fileService.handleData(Mono.just(data)、param、param2、instant);
}
另一方面,我不得不在基本依赖项的顶部添加一个服务器,因为netty似乎不处理多部分文件。因此,我添加了
spring boot starter tomcat
依赖项,这使得
多部分自动配置
能够在应用程序自动配置中匹配和满足

使用curl调用发布内容时:
curl'Meta Date:20170101104532'--格式“file=@file.bin”http://localhost:8082/myPath/foo/bar
当调试日志被激活时(
logging.level.org.springframework.web=debug
),我遇到了以下异常:
org.springframework.web.server.UnsupportedMediaTypeStatusException:请求失败[状态:415,原因:“内容类型”多部分/表单数据;边界=---------------------------58fa43b8f1a26de4“不支持”]

此错误由
RequestBodyArgumentResolver
引发,它具有以下支持的媒体类型:
[*/*,text/xml,application/*+json;charset=UTF-8,application/xml,text/plain;charset=UTF-8,application/x-www-form-urlencoded,application/json;charset=UTF-8]
由9
DecoderHttpMessageReader提供

在发布之前,我还看了一下:

  • 这似乎与此处无关,因为我的autoconf报告包含以下条目:
    MultipartAutoConfiguration#multipartResolver matched
  • 添加标题设置
    内容传输编码:binary
    没有改变任何内容
我的理解是SpringWeb5.0使用了一个新的请求解码器系统,因为我在Spring4Spring引导应用程序中找不到这些类,而且还没有任何
DecoderHttpMessageReader
处理多部分文件
我错过了什么吗?或者我应该等待一个功能的实现吗?

好的,现在似乎还没有实现,因为它当前存在对该功能的拉取请求:

我应该早点检查这个

[编辑]:问题已解决并合并到Spring主分支中。不应再是问题。

@PutMapping(value=“/{..}”,consumes=MediaType.MULTIPART\u FORM\u DATA\u value)
@PutMapping(value="/{..}",consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public Mono<Void> save(@RequestPart("file") FilePart multipartFormData,@RequestParam("fileName") String fileName,@PathVariable("..") String ..) throws IOException {        
        List<ByteBuffer> bytesList = new LinkedList<>();

        multipartFormData.content().
          subscribe(item->bytesList.add(item.asByteBuffer()));

        int totalBytes = bytesList.stream().mapToInt(item->item.capacity()).sum();

        ByteBuffer buffer =  ByteBuffer.allocate(totalBytes);
        bytesList.stream().forEach(byteBuff->buffer.put(byteBuff));
        baseImageHandler.saveImage(buffer, fileName, baseItemId);
        return Mono.empty();
    }
公共Mono save(@RequestPart(“file”)FilePart multipartFormData、@RequestParam(“fileName”)String fileName、@PathVariable(“…”)String..)引发IOException{ List bytesList=newlinkedlist(); multipartFormData.content()。 订阅(item->bytesList.add(item.asByteBuffer()); int totalBytes=bytesList.stream().mapToInt(item->item.capacity()).sum(); ByteBuffer缓冲区=ByteBuffer.allocate(总字节); bytesList.stream().forEach(byteBuff->buffer.put(byteBuff)); saveImage(缓冲区、文件名、baseItemId); 返回Mono.empty(); }

请注意,它是一个dev-verison,但我就是这样做的。

我认为它在最新的Spring 5中可用,我已经为multipart编写了一个小演示,检查这里:,不要忘记显式地将artifact
nio multipart parser
添加到项目依赖项中,目前,Spring Boot 2.0.0.M3不包括在webflux starter中添加它。我将在本周检查它。如果正确,我将更新答案以清楚地指出它。