zoukankan      html  css  js  c++  java
  • spring mvc文件上传(下)

    上一篇是使用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,也是可行的。

    前进时,请别遗忘了身后的脚印。
  • 相关阅读:
    Mybatis传入list的注意点
    synchronized锁
    手撸红黑树
    Vue cdn加速配置
    多线程之BlockingQueue中 take、offer、put、add的一些比较
    线程池
    ThreadLocal
    jdk LocalDateTime mybatis 空指针解决办法
    不同对象中 类型与属性名的属性 进行数据转换
    HashMap 的put方法
  • 原文地址:https://www.cnblogs.com/liudaihuablogs/p/8856349.html
Copyright © 2011-2022 走看看