如何在Spring MVC Controller中接收多部分/表单数据?

时间:2019-09-05 09:13:03

标签: java spring-boot spring-mvc kotlin multipartform-data

我需要实现一个REST端点,该端点可以接收multipart / form-data
我使用:

  • Spring Boot
  • 科特琳
  • Spring MVC

包含以下部分的多部分表单提交:

部署名称-----文本/纯文本
启用重复过滤-----文本/纯文本
仅部署更改的-----文本/纯文本
部署源-----文本/纯文本
租户ID -----文本/纯文本
* ----- application / octet-stream

Rest Controller的外观如下:

    @PostMapping("/data/deployment/create")
    fun uploadDmn(
            @RequestParam("deployment-name")
            deploymentName: String,
            @RequestParam("enable-duplicate-filtering")
            enableDuplicateFiltering: String?,
            @RequestParam("deploy-changed-only")
            deployChangedOnly: String,
            @RequestParam("deployment-source")
            deploymentSource: String,
            @RequestParam("tenant-id")
            tenantId: String,
            @RequestParam("data")
            data: MultipartFile
    ) {
        println(deploymentName)
        println(deployChangedOnly)
        println(deploymentSource)
        println(tenantId)
        println(data.toString())
    }

对于所有有效的参数,但对于最后一个无效的参数。 我试图给出一个不起作用的名称“数据”,“ *”,“文件”。

  

不存在所需的请求部分“数据”

控制器没有看到该文件。

我也尝试过使用Retrofit:

    @PostMapping("/data/deployment/create")
    @Multipart
    fun uploadDmn(
            @Part("data")
            data: MultipartFile
    ) {
        println(data.toString())
}

但这也不起作用:

  

指定为非null的参数为null

如何处理该内容类型? multipart / form-data

请求示例:

--28319d96a8c54b529aa9159ad75edef9
Content-Disposition: form-data; name="deployment-name"

aName
--28319d96a8c54b529aa9159ad75edef9
Content-Disposition: form-data; name="enable-duplicate-filtering"

true
--28319d96a8c54b529aa9159ad75edef9
Content-Disposition: form-data; name="deployment-source"

process application
--28319d96a8c54b529aa9159ad75edef9
Content-Disposition: form-data; name="data"; filename="test.bpmn"

<?xml version="1.0" encoding="UTF-8"?>
<bpmn2:definitions ...>
  <!-- BPMN 2.0 XML omitted -->
</bpmn2:definitions>
--28319d96a8c54b529aa9159ad75edef9--

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:0)

希望我能帮助您。试试吧。

    @RequestMapping(value = "/putRequest",
        produces = { "application/json" }, 
        consumes = { "multipart/form-data" },
        method = RequestMethod.PUT)
    public ResponseEntity<SuccessDto> requestPut(@Valid @RequestParam(value = "commit", required = false, defaultValue="false") Boolean commit, @Valid @RequestPart("file") MultipartFile file) {
        return new ResponseEntity<>(HttpStatus.OK);
    }

答案 1 :(得分:0)

我猜你可以使用类似的东西

@RequestMapping(value = "/source/upload/{sourceName}", method = RequestMethod.POST)
    public List<String> uploadSource(@RequestParam("file") MultipartFile sourceFile,
            @PathVariable("sourceName") String sourceName) throws IOException {
        File outputFile = new File(System.getProperty("java.io.tmpdir"), sourceFile.getOriginalFilename());
        sourceFile.transferTo(outputFile);
        <<your business logic>>
        Files.deleteIfExists(outputFile.toPath());
        return Arrays.asList(columns);

    }

请注意,我已经在temp目录中创建了该文件的副本(通过代码),并在其中使用该文件来实现我的业务逻辑