此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Framework 6.2.10spring-doc.cadn.net.cn

多部分

之后MultipartResolver启用,POST 的内容 请求与multipart/form-data作为常规请求进行解析和访问 参数。以下示例访问一个常规表单字段和一个已上传的字段 文件:spring-doc.cadn.net.cn

@Controller
public class FileUploadController {

	@PostMapping("/form")
	public String handleFormUpload(@RequestParam("name") String name,
			@RequestParam("file") MultipartFile file) {

		if (!file.isEmpty()) {
			byte[] bytes = file.getBytes();
			// store the bytes somewhere
			return "redirect:uploadSuccess";
		}
		return "redirect:uploadFailure";
	}
}
@Controller
class FileUploadController {

	@PostMapping("/form")
	fun handleFormUpload(@RequestParam("name") name: String,
						@RequestParam("file") file: MultipartFile): String {

		if (!file.isEmpty) {
			val bytes = file.bytes
			// store the bytes somewhere
			return "redirect:uploadSuccess"
		}
		return "redirect:uploadFailure"
	}
}

将参数类型声明为List<MultipartFile>允许解决多个 文件。spring-doc.cadn.net.cn

@RequestParam注释被声明为Map<String, MultipartFile>MultiValueMap<String, MultipartFile>,如果没有在注释中指定参数名称, 然后,映射将填充每个给定参数名称的多部分文件。spring-doc.cadn.net.cn

使用 Servlet 多部分解析,您还可以声明jakarta.servlet.http.Part而不是 Spring 的MultipartFile,作为方法参数或集合值类型。

还可以将多部分内容用作与命令对象的数据绑定的一部分。例如,表单字段 和 file 可以是表单对象上的字段, 如以下示例所示:spring-doc.cadn.net.cn

class MyForm {

	private String name;

	private MultipartFile file;

	// ...
}

@Controller
public class FileUploadController {

	@PostMapping("/form")
	public String handleFormUpload(MyForm form, BindingResult errors) {
		if (!form.getFile().isEmpty()) {
			byte[] bytes = form.getFile().getBytes();
			// store the bytes somewhere
			return "redirect:uploadSuccess";
		}
		return "redirect:uploadFailure";
	}
}
class MyForm(val name: String, val file: MultipartFile, ...)

@Controller
class FileUploadController {

	@PostMapping("/form")
	fun handleFormUpload(form: MyForm, errors: BindingResult): String {
		if (!form.file.isEmpty) {
			val bytes = form.file.bytes
			// store the bytes somewhere
			return "redirect:uploadSuccess"
		}
		return "redirect:uploadFailure"
	}
}

也可以从 RESTful 服务中的非浏览器客户端提交多部分请求 场景。以下示例显示了带有 JSON 的文件:spring-doc.cadn.net.cn

POST /someUrl
Content-Type: multipart/mixed

--edt7Tfrdusa7r3lNQc79vXuhIIMlatb7PQg7Vp
Content-Disposition: form-data; name="meta-data"
Content-Type: application/json; charset=UTF-8
Content-Transfer-Encoding: 8bit

{
	"name": "value"
}
--edt7Tfrdusa7r3lNQc79vXuhIIMlatb7PQg7Vp
Content-Disposition: form-data; name="file-data"; filename="file.properties"
Content-Type: text/xml
Content-Transfer-Encoding: 8bit
... File Data ...

您可以使用以下命令访问“元数据”部分@RequestParam作为String但你会 可能希望它从 JSON 反序列化(类似于@RequestBody).使用@RequestPart注释以在使用 HttpMessageConverter 转换后访问多部分:spring-doc.cadn.net.cn

@PostMapping("/")
public String handle(@RequestPart("meta-data") MetaData metadata,
		@RequestPart("file-data") MultipartFile file) {
	// ...
}
@PostMapping("/")
fun handle(@RequestPart("meta-data") metadata: MetaData,
		@RequestPart("file-data") file: MultipartFile): String {
	// ...
}

您可以使用@RequestPart结合使用jakarta.validation.Valid或使用 Spring 的@Validated注释,这两者都会导致应用标准 Bean 验证。 默认情况下,验证错误会导致MethodArgumentNotValidException,转动 转化为 400 (BAD_REQUEST) 响应。或者,您可以在本地处理验证错误 在控制器内通过ErrorsBindingResult论点 如以下示例所示:spring-doc.cadn.net.cn

@PostMapping("/")
public String handle(@Valid @RequestPart("meta-data") MetaData metadata, Errors errors) {
	// ...
}
@PostMapping("/")
fun handle(@Valid @RequestPart("meta-data") metadata: MetaData, errors: Errors): String {
	// ...
}

如果方法验证适用,因为其他参数具有@Constraint附注 然后HandlerMethodValidationException而是被提高。有关更多详细信息,请参阅 验证部分。spring-doc.cadn.net.cn