springMVC和springBoot使用MultipartFile上传文件

springMVC和SpringBoot使用MultipartFile上传单文件和多个文件非常的容易,springMVC是在Apache Commens FileUpload的技术上实现了一个MultipartResolver实现类,用到了MultipartFile类来接收参数。于是springMVC上传要Apache Commens FileUpload的组件,及它的jar包。

对于SpringBoot来说不用任何配置,只要在pom文件中添加依赖Apache Commens FileUpload的组件的就行。但是spring-boot也自带了org.springframework.web.multipart.MultipartFile,而且我们可以在application. properties配置文件限制上传文件的大小:
application. properties文件

  1. # 上传文件总的最大值
  2. spring.servlet.multipart.max-request-size=10MB
  3. # 单个文件的最大值
  4. spring.servlet.multipart.max-file-size=10MB

当然我们可以用java配置来配置MultipartResolver

  1. @Bean
  2. public MultipartResolver multipartResolver{
  3. commonsMultipartResolver multipartResolver=new commonsMultipartResolver();
  4. multipartResolver.setMaxUploadSize(100000);//设置上传最大
  5. return multipartResolver;
  6. }

因为不是SpringBoot,所以SpringMVC上下文中并没有默认装配MultipartResolver,所以我们要在MVC的配置文件中添加以下配置:

springmvc-config.xml文件

  1. class="org.springframework.web.multipart.commons.CommonsMultipartResolver" id="multipartResolver">
  2. - name="maxUploadSize">
  3. 10485760
  4. name="defaultEncoding">
  5. UTF-8

注意:记得添加commons-fileupload的jar包放到类路径下,也可以放在lib目录中。
1.普通上传,SpringMVc上传实列:
form表单

  1. action="upload" enctype="multipart/form-data" method="post">
  2. 文件描述: type="text" name="description">
    请选择文件: type="file" name="file">
    type="submit" value="上传">

控制层接收

  1. @Controller
  2. public class FileUploadController{
  3. // 上传文件会自动绑定到MultipartFile中
  4. @RequestMapping(value="/upload",method=RequestMethod.POST)
  5. public String upload(HttpServletRequest request,
  6. @RequestParam("description") String description,
  7. @RequestParam("file") MultipartFile file) throws Exception{
  8. System.out.println(description);
  9. // 如果文件不为空,写入上传路径
  10. if(!file.isEmpty()){
  11. // 上传文件路径
  12. String path = request.getServletContext().getRealPath(
  13. "/images/");
  14. // 上传文件名
  15. String filename = file.getOriginalFilename();
  16. File filepath = new File(path,filename);
  17. // 判断路径是否存在,如果不存在就创建一个
  18. if (!filepath.getParentFile().exists()) {
  19. filepath.getParentFile().mkdirs();
  20. }
  21. // 将上传文件保存到一个目标文件当中
  22. file.transferTo(new File(path+File.separator+ filename));
  23. return "success";
  24. }else{
  25. return "error";
  26. }
  27. }
  28. }

SpringMVC会将上传的文件绑定在MultipartFile的对象中,而MultipartFile对象提供各种方法操作文件,还可以用transferTo()方法将文件存在磁盘中。常用的方法:

byte[] getBytes()获取文件数据
String getContentType() 获取mime信息,如image/jpeg
InputStream getInputStream 获取文件流
String getName()获取文件名
String getOriginalFilename() 获取文件原名
transferTo(File to) 将文件保存到目标文件中
注意:表单的method设置为post,enctype为multipart/form-data

2.当然我们也可以用对象来保存,这样更方便:

  1. // 域对象,实现序列化接口
  2. public class User implements Serializable{
  3. private String description;
  4. private MultipartFile file;
  5. //setting方法和getting方法
  6. }
  7. @Controller
  8. public class FileUploadController{
  9. @RequestMapping(value="/upload")
  10. public String register(HttpServletRequest request,
  11. @ModelAttribute User user,
  12. Model model)throws Exception{
  13. System.out.println(user.getDescription());
  14. }
  15. }

这样我们就可以把附件和描述保存在User对象中了。

3.多文件上传接收
单文件的话只需要一个变量即,多文件上传的话就将MultipartFile改为数组,然后分别上传保存即可

  1. method="post" action="/multiUpload" enctype="multipart/form-data">
  2. type="file" name="file">
  3. type="file" name="file">
  4. type="file" name="file">
  5. type="submit" value="提交">
  6. @RequestMapping(value="/multiUpload", method=RequestMethod.POST )
  7. public @ResponseBody String multipleSave(@RequestParam("file") MultipartFile[] files){
  8. String fileName = null;
  9. String msg = "";
  10. if (files != null && files.length >0) {
  11. for(int i =0 ;i< files.length; i++){
  12. try {
  13. fileName = files[i].getOriginalFilename();
  14. byte[] bytes = files[i].getBytes();
  15. BufferedOutputStream buffStream =
  16. new BufferedOutputStream(new FileOutputStream(new File("/tmp/" + fileName)));
  17. buffStream.write(bytes);
  18. buffStream.close();
  19. msg += "You have successfully uploaded " + fileName";
  20. } catch (Exception e) {
  21. return "You failed to upload " + fileName + ": " + e.getMessage();
  22. }
  23. }
  24. return msg;
  25. } else {
  26. return "Unable to upload. File is empty.";
  27. }
  28. }
  29. }