SpringMVC文件上传下载

准备工作

Web项目中,文件上传功能几乎是必不可少的,那么如何使用SpringMVC框架完成文件的上传以及下载,其底层使用的是Apache fileupload组件完成上传,SpringMVC只是进行了封装,让开发者使用起来更加方便,所以首先需要引入fileupload组件的依赖。

1.引入相关依赖包
    
    
        commons-fileupload
        commons-fileupload
        1.3.1
    
2.配置文件上传视图解析器

该视图解析器由SpringMVC提供,注意bean的id为固定值

    
        
        
        
        
        
        
        
        
    

单文件上传

1.准备上传表单

注意表单的method必须为post,get请求只会提交文件名到后台
表单的enctype值固定为multipart/form-data,以二进制的形式传输数据

2. 编写上传服务

这里使用由SpringMVC提供的MultipartFile接口,使用工具类完成上传操作

    @RequestMapping(value="/doUpload", method=RequestMethod.POST)
    public String doUploadFile(@RequestParam("file") MultipartFile file,HttpServletRequest request) throws IOException{
        
        if(!file.isEmpty()){
            //originalFilename:文件原始名称
            log.debug("Process file: {}", file.getOriginalFilename());
            //FileUtils.copyInputStreamToFile(file.getInputStream(), 
            //      new File("d:\\remoteDemo\\", System.currentTimeMillis()+ file.getOriginalFilename()));
            //上传到webapp下的resources/imgs目录中
            String path = request.getServletContext().getRealPath("/resources/imgs");
            //文件上传,将文件流拷贝到目标文件对象中
            FileUtils.copyInputStreamToFile(file.getInputStream(), 
                    new File(path, System.currentTimeMillis()+ file.getOriginalFilename()));
            //上传的第二种方式,使用file提供的方法
            //file.transferTo(new File(path, System.currentTimeMillis()+ file.getOriginalFilename()));
            //返回成功页面
            return "success";
        }
        return "error";
    }

多文件上传

1.准备上传表单
2.多文件上传服务

第一种方式:使用SpringMVC提供的文件请求包装类MultipartHttpServletRequest

    @RequestMapping(value="/doUpload2", method=RequestMethod.POST)
    public String doUploadFile2(MultipartHttpServletRequest multiRequest) throws IOException{
        //遍历
        Iterator filesNames = multiRequest.getFileNames();
        while(filesNames.hasNext()){
            String fileName =filesNames.next();
            MultipartFile file =  multiRequest.getFile(fileName);
            if(!file.isEmpty()){
                log.debug("Process file: {}", file.getOriginalFilename());
                FileUtils.copyInputStreamToFile(file.getInputStream(), 
                      new File("d:\\remoteDemo\\", System.currentTimeMillis()+ file.getOriginalFilename()));
            }       
        }
        return "success";
    }

第二种方式:依然使用SpringMVC提供的文件请求包装类MultipartHttpServletRequest

    @RequestMapping(value = "/doUpload2", method=RequestMethod.POST)
    @ResponseBody
    public String doUploadFile2(MultipartHttpServletRequest multiRequest, HttpServletRequest request) throws Exception{
        //另一种遍历方式,这时候要求前端文件表单的name值都为file
        List files = multiRequest.getFiles("file");
        String path = request.getSession().getServletContext().getRealPath("file");
        if(files != null && !files.isEmpty()){
            for (int i = 0; i < files.size(); i++) {
                MultipartFile file = files.get(i);
                if(!file.isEmpty()){
                    FileUtils.copyInputStreamToFile(file.getInputStream(), new File(path, file.getOriginalFilename()));
                }
            }
            return "success";
        }
        return "error";
    }

第三种方式:使用MultipartFile数组接收参数

    @RequestMapping(value = "/doUpload2", method=RequestMethod.POST)
    @ResponseBody
    public String doUploadFile2(@RequestParam("file") MultipartFile[] files, HttpServletRequest request) throws Exception{
        //同样要求前端文件表单的name值都为file
        String path = request.getSession().getServletContext().getRealPath("file");
        for (MultipartFile file : files) {
            if (file.getSize() > 0) {
               String fileName = file.getOriginalFilename();
               File f = new File(path, fileName);
               file.transferTo(f);
             }
        }
        return "success";
    }

文件下载

1.文件下载表单
下载图片
2.文件下载服务
    @RequestMapping(value = "/download")
    public void downloadFile(String fileName, HttpServletRequest request, HttpServletResponse response){
        if(fileName != null){
            String realPath = request.getSession().getServletContext().getRealPath("file/");
            File file = new File(realPath, fileName);
            OutputStream out = null;
            if(file.exists()){
              //设置下载完毕不打开文件 
              response.setContentType("application/force-download");
              //设置文件名 
              response.setHeader("Content-Disposition", "attachment;filename="+fileName);
              try {
                  out = response.getOutputStream();
                  //使用工具类
                  out.write(FileUtils.readFileToByteArray(file));
                  out.flush();
              } catch (IOException e) {
                  e.printStackTrace();
              }finally{
                  if(out != null){
                      try {
                        out.close();
                      } catch (IOException e) {
                        e.printStackTrace();
                      }
                  }
              }
            }
        }
    }

你可能感兴趣的:(SpringMVC文件上传下载)