liudaihuablogs

上一篇是使用CommonsMultipartResolver的方式去处理文件上传的,下面来说说另一种方式StandardServletMultipartResolver

使用StandardServletMultipartResolver

 

1.使用StandardServletMultipartResolver不需要依赖额外的包 推荐使用这种方式
2.在applicationContext.xml文件里配 置StandardServletMultipartResolver的bean

<bean id="multipartResolver"     class="org.springframework.web.multipart.support.StandardServletMultipartResolver">
</bean>

3.在web.xml文件里配置multipart-config

<!-- 上传文件-使用的bean为:StandardServletMultipartResolver时需要配置如下 -->
<multipart-config>
  <location></location><!-- String类型 存放生成的文件地址,默认值为“”,文件地址是文件系统里的据对路径,它不支 持相对路径,所以一般不要配置它 -->
  <max-file-size>20848820</max-file-size>
  <max-request-size>418018841</max-request-size>
  <file-size-threshold>1048576</file-size-threshold>
</multipart-config>

 

下面我们就可以写controller去接收前台的文件提交请求了

前台:

前台页面

<form method="post" action="./uploadPart" enctype="multipart/form-data"><!-- 上传文件的提交编码类型要为multipart/form-data-->
  <input type="file" name="file" value="请选择上传的文件">
  <input type="submit" value="提交">
</form>

后台(可以有三种方式去处理文件上传的请求):

第一种:HttpServletRequest

@RequestMapping(value = "/uploadFile", method = RequestMethod.POST)
public ModelAndView uploadFile(HttpServletRequest request) {
  //进行转换
  MultipartHttpServletRequest msq = (MultipartHttpServletRequest) request;
  //获得请求上传的文件
  MultipartFile file = msq.getFile("file");

  ModelAndView mv = new ModelAndView();
  mv.setView(new MappingJackson2JsonView());// 使返回结果为json格式
  // 创建文件保存路径
  String filename = request.getSession().getServletContext().getRealPath("/") + "upload/";

  // 判断保存路径是否存在,不存在则创建 mkdirs表示创建多层目录 mkdir只能创建一层
  File dest = new File(filename);
  if (!dest.exists()) {
    dest.mkdirs();
  }
  try {
    //获取原始文件名
    filename += file.getOriginalFilename();
    File actdest = new File(filename);//目标文件
    //保存文件
    file.transferTo(actdest);
    mv.addObject("success", true);
    mv.addObject("msg", "上传文件成功");
  } catch (IllegalStateException | IOException e) {
    mv.addObject("success", false);
    mv.addObject("msg", "上传文件失败");
    e.printStackTrace();
  }
  return mv;
}

 

 

第二种:MultipartFile

@RequestMapping(value = "/uplodeFileMultipartFile", method = RequestMethod.POST)
public ModelAndView uplodeFileMultipartFile(MultipartFile file, HttpServletRequest request) {
  ModelAndView mv = new ModelAndView();
  mv.setView(new MappingJackson2JsonView());
  // 获取原始路径名
  String fileName = file.getOriginalFilename();
  file.getContentType();
  // 配置存储文件路径
  String path = request.getSession().getServletContext().getRealPath("/") + "upload/";
  try {
      File filemkdirs = new File(path);
      if (!filemkdirs.exists()) {
        filemkdirs.mkdirs();
      }
      path += fileName;
      File dest = new File(path);
      file.transferTo(dest);
      mv.addObject("success", true);
      mv.addObject("msg", "上传文件成功!");
    } catch (IllegalStateException | IOException e) {
      e.printStackTrace();
      mv.addObject("success", false);
      mv.addObject("msg", "上传文件失败!");
    }
    return mv;
}

 

 

第三种:Part

//import javax.servlet.http.Part;

@RequestMapping(value = "/uploadPart", method = RequestMethod.POST)
public ModelAndView uploadPart(Part file, HttpServletRequest request) {
  ModelAndView mv = new ModelAndView();
  mv.setView(new MappingJackson2JsonView());
  String fileName = file.getSubmittedFileName();
  String path = request.getSession().getServletContext().getRealPath("/") + "upload/";
  try {
      File filePath = new File(path);
      if (!filePath.exists()) {
        filePath.mkdirs();
      }
      path += fileName;
      file.write(path);// 也可以直接写其他路径file.write("E:/mvc/upload/"+fileName);
      mv.addObject("success", true);
      mv.addObject("msg", "上传文件成功!");
    } catch (IllegalStateException | IOException e) {
      e.printStackTrace();
      mv.addObject("success", false);
      mv.addObject("msg", "上传文件失败!");
  }
  return mv;
}

是的没错,如果你使用StandardServletMultipartResolver的方式后台有三种方式去处理文件上传的请求。

前两种既可以使用StandardServletMultipartResolver也可以使用CommonsMultipartResolver,但是Part只能使用StandardServletMultipartResolver的方式,因为Part需要配置web.xml里的multipart-config,当然我也尝试过CommonsMultipartResolver使用时去配置web.xml里的multipart-config,也是可行的。

相关文章: