拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 Spring中的Multipart请求处理

Spring中的Multipart请求处理

白鹭 - 2021-11-24 681 0 0

1.简介

在本教程中,我们将重点介绍在Spring Boot中发送多部分请求的各种机制。多部分请求包括发送各种不同类型的数据,这些数据被边界分隔为单个HTTP方法调用的一部分。

通常,我们可以在此请求中发送复杂的JSON,XML或CSV数据,以及传输多部分文件。多部分文件的示例可以是音频或图像文件。同样,我们也可以将包含多部分文件的简单键/值对数据作为多部分请求发送。

让我们研究一下发送数据的各种方式。

2.使用@ModelAttribute

让我们考虑一个简单的用例,该用例使用表格发送由姓名和文件组成的员工数据。

首先,让我们创建一个Employee抽象来存储表单数据:

public class Employee {

 private String name;

 private MultipartFile document;

 }

接下来,让我们使用Thymeleaf生成表单:

<form action="#" th:action="@{/employee}" th:object="${employee}" method="post" enctype="multipart/form-data">

 <p>name: <input type="text" th:field="*{name}" /></p>

 <p>document:<input type="file" th:field="*{document}" multiple="multiple"/>

 <input type="submit" value="upload" />

 <input type="reset" value="Reset" /></p>

 </form>

需要注意的重要一点是,我们在视图enctype声明为multipart/form-data

最后,我们将创建一个接受表单数据(包括多部分文件)的方法:

@RequestMapping(path = "/employee", method = POST, consumes = { MediaType.MULTIPART_FORM_DATA_VALUE })

 public String saveEmployee(@ModelAttribute Employee employee) {

 employeeService.save(employee);

 return "employee/success";

 }

这里,两个特别重要的细节是:

  • consumes属性值设置为multipart/form-data
  • @ModelAttribute已将所有表单数据(包括上载的文件)捕获到Employee

3.使用@RequestPart

该批注将multipart请求的一部分与method参数关联,这对于将复杂的多属性数据作为有效载荷(例如JSON或XML)发送很有用。

让我们创建一个带有两个参数的方法,第一个参数为Employee类型,第二个MultipartFile为MultipartFile。此外,我们将使用@RequestPart注释这两个参数:

@RequestMapping(path = "/requestpart/employee", method = POST, consumes = { MediaType.MULTIPART_FORM_DATA_VALUE })

 public ResponseEntity<Object> saveEmployee(@RequestPart Employee employee, @RequestPart MultipartFile document) {

 employee.setDocument(document);

 employeeService.save(employee);

 return ResponseEntity.ok().build();

 }

现在,要查看该注解的实际效果,让我们使用MockMultipartFile创建测试:

@Test

 public void givenEmployeeJsonAndMultipartFile_whenPostWithRequestPart_thenReturnsOK() throws Exception {

 MockMultipartFile employeeJson = new MockMultipartFile("employee", null,

 "application/json", "{\"name\": \"Emp Name\"}".getBytes());



 mockMvc.perform(multipart("/requestpart/employee")

 .file(A_FILE)

 .file(employeeJson))

 .andExpect(status().isOk());

 }

上面要注意的重要一点是,我们已将Employee部分application/JSON 。此外,除了分段文件之外,我们还将这些数据作为JSON文件发送。

有关如何测试多部分请求的更多详细信息,请参见此处。

4.使用@RequestParam

发送多部分数据的另一种方法是使用@RequestParam 。这对于简单数据特别有用,它与文件一起作为键/值对发送

@RequestMapping(path = "/requestparam/employee", method = POST, consumes = { MediaType.MULTIPART_FORM_DATA_VALUE })

 public ResponseEntity<Object> saveEmployee(@RequestParam String name, @RequestPart MultipartFile document) {

 Employee employee = new Employee(name, document);

 employeeService.save(employee);

 return ResponseEntity.ok().build();

 }

让我们为此方法编写测试以演示:

@Test

 public void givenRequestPartAndRequestParam_whenPost_thenReturns200OK() throws Exception {

 mockMvc.perform(multipart("/requestparam/employee")

 .file(A_FILE)

 .param("name", "testname"))

 .andExpect(status().isOk());

 }

5.结论

在本文中,我们研究了如何在Spring Boot中有效处理多部分请求。

最初,我们使用模型属性发送多部分表单数据。然后,我们研究了如何使用@RequestPart@RequestParam批注分别接收多部分数据。

标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *