SpringMVC实现文件上传

使用JavaConfig方式实现Spring MVC上传文件

  1. 在项目的初始化类继承org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer抽象类并且实现customizeRegistration(…) 方法。

    @Override
    protected void customizeRegistration(ServletRegistration.Dynamic registration) {
       super.customizeRegistration(registration);
       // 上传文件的存放位置
       String filepath = "D:\\JavaProject\\SpringDemo\\SpringMVC03\\src\\main\\webapp\\uploads";
       // 单个文件最大大小限制
       Long singleMax = (long) (5 * Math.pow(2, 20));
       // 多个文件的最大总大小限制
       Long totalMax = (long) (10 * Math.pow(2, 20));
       registration.setMultipartConfig(
               new MultipartConfigElement(filepath, singleMax, totalMax, 0));
    }
  2. 声名name为multipartResolver的Bean

    @Bean(name = "multipartResolver")
    public MultipartResolver multipartResolver() throws IOException {
       /* 需要导入第三方依赖
       CommonsMultipartResolver resolver = new CommonsMultipartResolver();
       // 临时目录,请求完成后临时文件会被删除
       resolver.setUploadTempDir(new FileSystemResource("d:\\tmp\\jackaroo\\uploads"));
       resolver.setMaxUploadSize(2097152);
       resolver.setMaxInMemorySize(0);
       */
    
       /*高版本的Spring和Servlet容器中使用此方式,不需要导入第三方依赖*/
       StandardServletMultipartResolver resolver = new StandardServletMultipartResolver();
       return resolver;
    }
  3. 三种方式实现文件上传

    /*使用Servlet中的HttpServletRequest,但是需要依赖Servlet容器,耦合性较大(不推荐使用)*/
    @RequestMapping("/upload")
    public ModelAndView upload(HttpServletRequest request) {
       // 进行转换
       MultipartHttpServletRequest mhsr = (MultipartHttpServletRequest) request;
       // 获得请求上传的文件
       MultipartFile file = mhsr.getFile("file");
       // 设置视图为JSON视图
       ModelAndView mv = new ModelAndView();
       mv.setView(new MappingJackson2JsonView());
       // 获取原始文件名
       String fileName = file.getOriginalFilename();
       // 目标文件
       File dest = new File(fileName);
       try {
           // 保存文件
           file.transferTo(dest);
           // 保存成功
           mv.addObject("success", true);
           mv.addObject("msg", "上传文件成功");
       } catch (IllegalStateException | IOException e) {
           // 保存失败
           mv.addObject("success", false);
           mv.addObject("msg", "上传文件失败");
           e.printStackTrace();
       }
       return mv;
    }
    
    // 使用MultipartFile(不依赖与Servlet容器,推荐使用)
    @RequestMapping("/uploadMultipartFile")
    public ModelAndView uploadMultipartFile(MultipartFile file) {
       // 定义JSON视图
       ModelAndView mv = new ModelAndView();
       mv.setView(new MappingJackson2JsonView());
       // 获取原始文件名
       String fileName = file.getOriginalFilename();
       file.getContentType();
       // 目标文件
       File dest = new File(fileName);
       try {
           // 保存文件
           file.transferTo(dest);
           mv.addObject("success", true);
           mv.addObject("msg", "上传文件成功");
       } catch (IllegalStateException | IOException e) {
           mv.addObject("success", false);
           mv.addObject("msg", "上传文件失败");
           e.printStackTrace();
       }
       return mv;
    }
    
    // 使用Part
    @RequestMapping(value="/uploadPart", method=RequestMethod.POST)
    public ModelAndView uploadPart(Part file) {
       ModelAndView mv = new ModelAndView();
       mv.setView(new MappingJackson2JsonView());
       // 获取原始文件名(javax.servlet-api 3.1.0)
       String fileName = file.getSubmittedFileName();
       File dest = new File(fileName);
       try {
           // 保存文件
           file.write("D:/JavaProject/SpringDemo/SpringMVC03/src/main/webapp/uploads/" + fileName);
           mv.addObject("success", true);
           mv.addObject("msg", "上传文件成功");
       } catch (IllegalStateException | IOException e) {
           mv.addObject("success", false);
           mv.addObject("msg", "上传文件失败");
           e.printStackTrace();
       }
       return mv;
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值