1、页面表单
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>文件上传</title>
</head>
<body>
<form method="post" enctype="multipart/form-data" action="/upload">
<label>单文件上传:</label><input type="file" name = "single"/><br>
<label>多文件上传:</label><input type="file" name = "multi" multiple/><br>
<input type="submit" value="上传"/>
</form>
</body>
</html>
2、控制器
@Slf4j
@Controller
public class UploadController {
@GetMapping("/file")
public String file(){
return "file";
}
@PostMapping("/upload")
@ResponseBody
public String upload(@RequestPart("single")MultipartFile sf, @RequestPart("multi")MultipartFile[] mf) throws IOException {
log.info("sf.size(),mf.length",sf.getSize(),mf.length);
File file = new File("F:\\files");
if (!file.exists()){
file.mkdir();
}
if (!sf.isEmpty()){
//保存到服务器
String fName = sf.getOriginalFilename();
sf.transferTo(new File(file,fName));
}
if (mf.length > 0){
for(MultipartFile photo: mf){
if (!photo.isEmpty()){
String fName = photo.getOriginalFilename();
photo.transferTo(new File(file,fName));
}
}
}
return "上传成功";
}
}
3、文件上传自动配置原理
文件上传自动配置类-MultipartAutoConfiguration,MultipartProperties
- 自动配置好了 StandardServletMultipartResolver 【文件上传解析器】
- 原理步骤
1、请求进来使用文件上传解析器判断(isMultipart)并封装(resolveMultipart,返回MultipartHttpServletRequest)文件上传请求
2、参数解析器来解析请求中的文件内容封装成MultipartFile
3、将request中文件信息封装为一个Map;MultiValueMap<String, MultipartFile>
4、FileCopyUtils。实现文件流的拷贝