当前位置: 首页 > 知识库问答 >
问题:

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

祁通
2023-03-14

我需要实现一个RESTendpoint,它接收我使用的多部分/表单数据:

  • Spring防尘套
  • 科特林
  • SpringMVC

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

部署名称------文本/普通
启用重复筛选------文本/普通
仅更改部署------文本/普通
部署源------文本/普通
租户id------文本/普通
*----应用程序/八位字节流

Rest控制器看起来是这样的:

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

对于所有有效的参数,但对于最后一个无效的参数。我试图给一个不起作用的名称“data”、“*”和“file”。

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

控制器没有看到该文件

我也尝试过使用改装:

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

有人能帮忙吗?

共有2个答案

鲁英卫
2023-03-14

我想你可以用这样的东西:

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

    }

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

糜帅
2023-03-14

我希望我能在这方面帮助你。试试看。

    @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);
    }
 类似资料:
  • 我正在向webapi控制器发送多部分数据。如何阅读方法中的内容?

  • 我正在尝试编写一个SpringMVC方法,它可以接收多部分/表单或传输编码的分块文件上传。我可以编写一个单独的方法来处理每种类型,但我希望使用相同的方法,以便使用相同的REST POST uri,例如: 以下是我迄今为止最好的尝试: 使用上述方法,我可以上传一个多部分文件,但如果我上传一个分块文件,我会从spring得到一个异常,它说: 如果我删除MultipartFile请求参数,它非常适合分块

  • 我正试图弄明白这一点。我的代码没有收到任何有用的错误消息,所以我使用了其他东西来生成一些东西。我在错误信息后附加了该代码。我已经找到了一个关于它的教程,但我不知道如何用我所拥有的实现它。这就是我目前拥有的: 错误: 对象{消息:“此资源不支持请求实体的媒体类型‘multipart/form data’。”,例外消息:“没有MediaTypeFormatter可用于读取媒体类型为“multipart

  • 无论我怎么努力,似乎都无法解决这个问题。我正在提交此curl命令: 我有一个带有注释@RestController的Spring Boot 1.4应用程序,方法如下: filedata变量始终为null,请求对象始终显示0个文件。 我已经尝试了MultipartResolver的多种配置。这是我的最新消息: 我也在我的应用程序中手动粘贴了这些。属性,以确保其未被禁用: Springhttp。多部分

  • 我正在尝试从接收包含3个参数的多部分请求: 一个 一个 我在控制器中接收到和fine,但json的所有字段都为NULL。会有什么问题吗? JSON 控制器 邮差

  • 有一个spring mvc控制器资源来接收文件并将其存储在本地存储器中。请求是一个多部分(“内容类型:多部分/表单数据”),由几个部分组成。第一部分是文件的JSON/XML描述。第二个和以下是文件。但这些部分也可能是多部分的(“内容类型:多部分/混合”)。一部分中的文件很少。多部分中的多部分。 我必须根据请求结构将它们分组存储。身体txt和图片。gif来自一个组中的第二个表单数据部分,文件来自另一