liudaihuablogs

springMVC上传文件是通过MultipartResolver(Multipart解析器)处理的,对于MultipartResolver是一个接口,它有两个实现类

CommonsMultipartResolver 依赖于Apache下的Jakarta Common FileUplode项目解析Multipart请求,可以在spring的各个版本中使用,只是它要依赖第三方实现包才得以实现
StandardServletMultipartResolver 是spring3.1版本后的产物,它依赖于Servlet3.0或者更高版本的实现,它不需要依赖第三方包

你可以使用CommonsMultipartResolver上传文件,也可以使用StandardServletMultipartResolver上传文件,下面先以CommonsMultipartResolver这个解析器上传文件为例,来看看怎么去写。

使用CommonsMultipartResolver
1.使用CommonsMultipartResolver时需要依赖两个包,你可以在pom.xml中加入这两个包的依赖 Apache的commons-io和commons-fileupload
2.在applicationContext.xml文件里配置CommonsMultipartResolver的bean

<!-- 使用CommonsMultipartResolver它需要导入两个依赖包 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
  <!--  最大上传 -->  

  <property name="maxUploadSize">
    <value>104857600</value>
  </property>

   <!-- 读取文件到内存中最大的字节数,一般是1024 -->
  <property name="maxInMemorySize">
    <value>4096</value>
  </property>
</bean>

下面我们就可以写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;
}

 

相关文章: