上传文件大家首先想到的就是Apache Commons FileUpload,这个库使用非常广泛。
Spring Boot3 版本中已经不能使用了。代替他的是 Spring Boot 中自己的文件上传实现。Spring Boot 上传文件现在变得非常简单。提供了封装好的处理上传文件的接口 MultipartResolver,用于解析上传文件的请求,他的内部实现类 StandardServletMultipartResolver。之前常用的CommonsMultipartResolver 不可用了。CommonsMultipartResolver 是使用Apache Commons FileUpload 库时的处理类StandardServletMultipartResolver 内部封装了读取 POST 其中体的请求数据,也就是文件内容。我们现在只需要在 Controllcr 的方法加入形参@RequestParam MultipartFilc。 MultipartFile 表示上传的文件,提供了方便的方法保存文件到磁盘。
MultipartResolver
@Controller
public class UpLoadFileController {
@PostMapping("/uploadFile")
public String upLoadFile(@RequestParam("upfile") MultipartFile multipartFile){
System.out.println("文件开始上传");
Map<String, Object> info = new HashMap<>();
try {
//判断文件是否为空
if(!multipartFile.isEmpty()){
//不为空
info.put("文件的参数名称", multipartFile.getName());
info.put("内容类型", multipartFile.getContentType());
var ext = "unknown";
//原始文件名
var fileName = multipartFile.getOriginalFilename();//a.jpg
if(fileName.indexOf(".") > 0){
ext = fileName.substring(fileName.indexOf(".") + 1);
}
//新文件名
var newFileName = UUID.randomUUID().toString()+ "." + ext;
var path = "E://file//" + newFileName;
//保存文件
multipartFile.transferTo(new File(path));
info.put("文件名称", newFileName);
System.out.println(info);
}
} catch (IOException e) {
e.printStackTrace();
}
//重定向
return "redirect:/index.html";
}
}
Servlet规范
@Controller
public class UploadAction {
@PostMapping("/files")
public String upload(HttpServletRequest request){
try {
for(Part part: request.getParts()){
String fileName = extractFileName(part);
//将文件写到服务器的目录
part.write(fileName);
}
}catch (Exception e){
e.printStackTrace();
}
return "redirect:/index.html";
}
private String extractFileName(Part part){
String contentDisp = part.getHeader("content-disposition");
String[] items = contentDisp.split(";");
System.out.println(contentDisp);
for(String s: items){
if(s.trim().startsWith("filename")){
return s.substring(s.indexOf("=") + 2, s.length() - 1);
}
}
return "";
}
}