0
点赞
收藏
分享

微信扫一扫

SpringMVC文件上传下载

Python百事通 2021-09-25 阅读 167

准备工作

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

1.引入相关依赖包
    <!-- 同时依赖commons-io包,该包也是我们所需要的,无需重复引入 -->
    <dependency>
        <groupId>commons-fileupload</groupId>
        <artifactId>commons-fileupload</artifactId>
        <version>1.3.1</version>
    </dependency>
2.配置文件上传视图解析器

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

    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!-- 限制文件上传总大小,不设置默认没有限制,单位为字节 200*1024*1024即200M -->
        <property name="maxUploadSize" value="209715200" />
        <!-- 设置每个上传文件的大小上限 -->
        <property name="maxUploadSizePerFile" value="1048576"/>
        <!-- 处理文件名中文乱码 -->
        <property name="defaultEncoding" value="UTF-8" />
        <!-- resolveLazily属性启用是为了推迟文件解析,以便捕获文件大小异常 -->
        <property name="resolveLazily" value="true" />
    </bean>

单文件上传

1.准备上传表单

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

<form method="post" action="/doUpload" enctype="multipart/form-data">
  <input type="file" name="file"/>
  <input type="submit"/>
</form>
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.准备上传表单
<form method="post" action="/doUpload2" enctype="multipart/form-data">
  <input type="file" name="file"/>
  <input type="file" name="file"/>
  <input type="submit"/>
</form>
2.多文件上传服务

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

    @RequestMapping(value="/doUpload2", method=RequestMethod.POST)
    public String doUploadFile2(MultipartHttpServletRequest multiRequest) throws IOException{
        //遍历
        Iterator<String> 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<MultipartFile> 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.文件下载表单
<a href="download?fileName=123.jpg">下载图片</a>
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();
                      }
                  }
              }
            }
        }
    }
举报

相关推荐

0 条评论