首页 文章

如何启用Spring Reactive Web MVC来处理Multipart文件?

提问于
浏览
2

我正在尝试在spring boot 2.0应用程序中使用新的反应式web-mvc实现 . 我正在尝试定义一个消耗多部分文件的方法但是没有成功使其工作:( - 我总是得到415错误 .

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

@RequestMapping(method = RequestMethod.POST, path = "/myPath/{param}/{param2}", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
@ResponseBody
public Mono<Void> postFile(
        @RequestBody MultipartFile data,
        @PathVariable("param") String param,
        @PathVariable("param2") String param2,
        @RequestHeader(name = HEADER_DATE, required = false)   @DateTimeFormat(pattern = DATE_FORMAT) Instant instant
){
    return fileService.handleData(Mono.just(data), param, param2, instant);
}

另一方面,我不得不在基本依赖项的顶部添加一个服务器,因为它似乎netty不处理多部分文件 . 我添加了 spring-boot-starter-tomcat 依赖项,使 MultipartAutoConfiguration 在应用程序自动配置上匹配并满足 .

当使用curl调用发布内容时: curl 'Meta-Date: 20170101104532' --form "file=@file.bin" http://localhost:8082/myPath/foo/bar ,同时调试日志被激活( logging.level.org.springframework.web=DEBUG )我遇到了这个异常: org.springframework.web.server.UnsupportedMediaTypeStatusException: Request failure [status: 415, reason: "Content type 'multipart/form-data;boundary=------------------------58fa43b8f1a26de4' not supported"]

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 提供 .

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

我的理解是Spring Web 5.0使用了一个新的请求解码器系统,因为我没有在spring 4 spring启动应用程序中找到这些类,并且还没有 DecoderHttpMessageReader 处理multipart文件我错过了什么?或者我应该等待一个实施?

2 回答

  • 0

    好的,这似乎暂时没有实现,因为它目前存在此功能的拉取请求:Add reactive multipart request support #1201

    应该早点检查一下......

    [编辑]:问题已经解决并合并到Spring master分支中 . 应该不再是一个问题 .

  • 1
    @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();
        }
    

    请注意,它是一个开发者,但这是我设法做到的 .

相关问题