使用Spring的REST多部分混合请求(文件+ json)

时间:2016-07-05 15:14:27

标签: spring rest spring-mvc curl spring-boot

我需要将一个文件与json一起发送到我的Spring Controller。我有以下控制器类:

@Controller
@RequestMapping("/perform")
public class PerformController {

    ...

    @RequestMapping(path = "gopdf", method = RequestMethod.POST, consumes = { "multipart/mixed" })
    @ResponseStatus(HttpStatus.CREATED)
    public void handleFileUpload(@RequestPart("file") MultipartFile file, @RequestPart("map") String map,   HttpServletResponse response) throws Exception {
        ...
    }

}

但是当我使用以下命令卷曲我的服务器时:

 curl -H "Content-Type: multipart/form-data" -F "map=@map.json; type=application/json" -F "content=@SMP.docx" -X POST localhost:9000/perform/gopdf-i -v

我得到415不支持的媒体类型!

有任何线索吗?

3 个答案:

答案 0 :(得分:3)

我找到了解决方案: 我需要使用@RequestParam而不是@RequestPart

@RequestMapping(path = "gopdf", method = RequestMethod.POST, consumes = { "multipart/form-data" })
@ResponseStatus(HttpStatus.OK)
public void handleFileUpload2(@RequestParam("file") MultipartFile file, @RequestParam("map") String jsonMap,
        HttpServletResponse response) throws Exceptio

答案 1 :(得分:1)

spring webflux(2.1.0)的multipart / mixed对我不起作用。这是一种可行的替代方法

  • 工作-spring-boot-starter-web / Multipart []-上传文件,其中 一个是有效负载,另一个是文件本身。就我而言,由于有效载荷是恒定的,因此它可以工作。
  • 不起作用-spring-boot-starter-webflux / Flux。助焊剂是空的。我尝试了此https://github.com/spring-projects/spring-boot/issues/13268,但没有成功

答案 2 :(得分:0)

它可能与您的请求映射注释有关。我认为缺少accept值来确定哪些服务可以接受:

示例:

@RequestMapping(path = "gopdf", method = RequestMethod.POST, consumes = { "multipart/mixed" }, accept = MediaType.MULTIPART_FORM_DATA_VALUE)

导入:

import org.springframework.http.MediaType;

文档/ API: http://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/http/MediaType.html