对于最新的稳定版本,请使用 Spring Framework 6.2.0! |
多部分
在MultipartResolver
已启用,则 POST 的内容
请求替换为multipart/form-data
作为常规请求进行解析和访问
参数。以下示例访问一个常规表单字段和一个已上传的表单字段
文件:
-
Java
-
Kotlin
@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>
允许解析多个
文件。
当@RequestParam
注解声明为Map<String, MultipartFile>
或MultiValueMap<String, MultipartFile>
,没有在注解中指定参数名称,
然后,地图中将填充每个给定参数名称的 Multipart 文件。
使用 Servlet 多部分解析,您还可以声明jakarta.servlet.http.Part 而不是 Spring 的MultipartFile 作为方法参数或集合值类型。 |
您还可以将多部分内容用作数据绑定到命令对象的一部分。例如,表单域 和前面示例中的 file 可以是表单对象上的字段, 如下例所示:
-
Java
-
Kotlin
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 的文件:
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
注解来访问一个 Multipart,然后在使用 HttpMessageConverter 转换它之后访问它:
-
Java
-
Kotlin
@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
注解,这两者都会导致应用 Standard Bean Validation。
默认情况下,验证错误会导致MethodArgumentNotValidException
,该
转换为 400 (BAD_REQUEST) 响应。或者,您可以在本地处理验证错误
在控制器中,通过Errors
或BindingResult
论点
如下例所示:
-
Java
-
Kotlin
@PostMapping("/")
public String handle(@Valid @RequestPart("meta-data") MetaData metadata,
BindingResult result) {
// ...
}
@PostMapping("/")
fun handle(@Valid @RequestPart("meta-data") metadata: MetaData,
result: BindingResult): String {
// ...
}