如何使Spring反应式Web MVC能够处理多部分文件?
我试图在SpringBoot2.0应用程序中使用新的反应式WebMVC实现。我试图定义一个使用多部分文件但无法使其正常工作的方法:(-我总是得到一个415错误 一方面,我有一个包含以下请求映射的控制器:如何使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(
@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]
由9DecoderHttpMessageReader提供
在发布之前,我还看了一下:
- 这似乎与此处无关,因为我的autoconf报告包含以下条目:
MultipartAutoConfiguration#multipartResolver matched
- 添加标题设置
没有改变任何内容内容传输编码:binary
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中添加它。我将在本周检查它。如果正确,我将更新答案以清楚地指出它。