如何在 Spring MVC 控制器中接收 multipart/form-data?

Posted

技术标签:

【中文标题】如何在 Spring MVC 控制器中接收 multipart/form-data?【英文标题】:How can I receive multipart/form-data in Spring MVC Controller? 【发布时间】:2020-01-08 03:49:23 【问题描述】:

我需要实现一个 REST-Endpoint,它接收 multipart/form-data 我使用:

弹簧靴 科特林 弹簧 MVC

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

部署名称 ----- text/plain 启用重复过滤 ----- 文本/纯文本 仅部署更改 ----- 文本/纯文本 部署源 ----- 文本/纯文本 租户 ID ----- 文本/纯文本 * ----- 应用程序/八位字节流

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())

但这也行不通:

指定为非空的参数为空

如何使用该内容类型?多部分/表单数据

请求示例:

--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--

有人可以帮忙吗?

【问题讨论】:

您是否将spring.servlet.multipart.enabled 设置为true @LHCHIN 不,但我尝试在 application.properties 中这样做。还是同样的问题:Parameter specified as non-null is null 您应该在 crsf 之前添加多部分过滤器。 ***.com/a/35405063/11951081 【参考方案1】:

我猜你可以使用这样的东西:

@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);

    

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

【讨论】:

【参考方案2】:

我希望我能帮助你。试试看。

    @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);
    

【讨论】:

我不知道你为什么用 Swagger 注释了 90% 的代码,但这里主要是注释 @RequestPart。不幸的是,这也不起作用。同样的问题“所需的请求部分'数据'不存在”。我认为问题出在发送此请求的应用程序中。该应用程序是“Camunda Modeler”。 “我认为问题出在发送此请求的应用程序中。”我同意。上面的代码在正文中需要一个带有“file”键的 FormData 对象。当然我不知道客户以哪种形式发送他的请求。也许钥匙必须调整。 尝试用@RequestPart("data") 改变@RequestPart("file")。

以上是关于如何在 Spring MVC 控制器中接收 multipart/form-data?的主要内容,如果未能解决你的问题,请参考以下文章

在spring mvc控制器接收json并反序列化为对象列表

如何在 Spring 3 MVC 应用程序中对文件上传进行病毒扫描[关闭]

支持Java Spring MVC

如何使用多部分/表单和分块编码在 spring mvc 中接收文件上传?

如何在spring mvc中的操作之前发送响应

Spring MVC前后端数据交互总结