springMVC文件的上传与下载

1.导包
在这里插入图片描述
2.springMVC-servlet.xml的配置

<!-- 文件上传的配置 -->
<bean id="multipartResolver"  class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
     文件的编码格式
     <property name="defaultEncoding" value="UTF8"></property>
     上传文件的最大大小   单位为字节 -1就是不限制大小
     <property name="maxUploadSize"  value="10000000"></property>
     上传多个文件时,每个文件的大小限制
     <property name="maxUploadSizePerFile"></property> 
     上传文件时,内存中最大的大小,如果超过这个大小,存到临时文件中
     <property name="maxInMemorySize"></property>
     设置储存临时文件的路径(文件夹即可)
     <property name="uploadTempDir"></property>
1. controller


* 

单文件上传

MultipartFile:用来接受前台传过来的文件

@PostMapping("/upload")
     //参数就是上传的文件
     public String uploadSingleFile(@RequestParam MultipartFile  file) throws IllegalStateException,  IOException {
           
           文件是否为空
           file.isEmpty());

           上传文件时,给的参数的名称,  input标签中name属性的值
           file.getName();
           
           获取文件的类型,例如图片,文本,视屏等等
           file.getContentType();
           
           
           获取文件名称
           String fileName =  file.getOriginalFilename();
           
           获取文件大小
           long fileSize = file.getSize();
          
           
           
           将上传的文件保存到服务器上的磁盘路径下
           获取当前工程的根目录的相对路径  /工程名
           request.getContextPath();
          
           当前文件部署到服务器上时,工程在服务器上的绝对路径
           String path = request.getRealPath("/");
          
           
            当上传的文件,储存在服务器上的话,那么当服务器重新运行时,上传的文件可能会消失
            将文件保存在磁盘上,为该位置配置一个虚拟路径

           储存在磁盘上
           String uploadPath =  "C:\\Users\\Administrator\\Desktop\\eclipse\\shua a a  kdiisjnishinishishjsuia\\springMVC_03\\WebContent\\upload";
           String savePath = uploadPath + "\\" + fileName;
           File uploadFile = new File(savePath);
           将文件转移到参数文件中
           file.transferTo(uploadFile);
           
           return "success";
     }

1.原生的response进行单文件下载

 @GetMapping("/download")
     @ResponseBody
     public void download(@RequestParam("name") String  fileName,HttpServletResponse response) throws IOException {
           String uploadPath =  "C:\\Users\\Administrator\\Desktop\\eclipse\\shua a a  kdiisjnishinishishjsuia\\springMVC_03\\WebContent\\upload";
           String downloadPath = uploadPath + "\\" + fileName;
           设置为下载方式
           response.setContentType("application/x-msdownload");
           下载文件显示的名称
           response.addHeader("Content-Disposition",  "attachment;filename=" + fileName);
           
           File file = new File(downloadPath);
           
            将第一个参数中的文件内容。拷贝response的输出流管道中,
            可以输出到前端
            
           Files.copy(file.toPath(),  response.getOutputStream());
     }

springMVC提供的单文件下载

springMVC
      ResponseEntity:向前端响应内容时,待响应状态
      不只可以用在下载上,可以用在所有的返回值内容为json的时候

     @GetMapping("/download2")
     @ResponseBody
     public ResponseEntity<byte[]>  download(@RequestParam("name") String fileName) throws  IOException{
           String uploadPath =  "C:\\Users\\Administrator\\Desktop\\eclipse\\shua a a  kdiisjnishinishishjsuia\\springMVC_03\\WebContent\\upload";
           String filePath = uploadPath + "//" + fileName;
           File file = new File(filePath);
           设置响应头
           HttpHeaders headers = new HttpHeaders();
           设置响应内容的格式为二进制流的
           headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
           设置下载文件的名称
           
           headers.setContentDispositionFormData("attachment",  fileName);
           
           将要下载的文件转换为字节数组的方式
           byte[] bytes = FileUtils.readFileToByteArray(file);
           
           创建ResponseEntity对象
           /*
            * 1.要返回给前端的数据
            * 2.响应头的设置
            * 3.响应的状态码
            */
           ResponseEntity<byte[]> entity = new  ResponseEntity<byte[]>(bytes, headers, HttpStatus.OK);
           return entity;
     }

springmvc提供的下载方式和原生的区别

使用response的outputStream和人spring方式下载

  spring将文件一次性交给前端
  原生的到输出管道中
 
  当文件比较大的时候,一次性交给前端,很有可能会造成网络的阻塞
  也有可能内存不够,像上面,我们是将文件一次性输出到字节数组中,然后
  给前端返回,字节数组是内存中存储着的,就会导致内存不够用
  原生的,将文件输出到outputStream中去了,一边输出一边下载,对内存的压力小

多文件的上传

@PostMapping("/uploads")
     public String uploadFiles(@RequestParam MultipartFile[]  files) throws IllegalStateException, IOException {
           String uploadPath =  "C:\\Users\\Administrator\\Desktop\\eclipse\\shua a a  kdiisjnishinishishjsuia\\springMVC_03\\WebContent\\upload";
           for (MultipartFile file : files) {
                
                String fileName = file.getOriginalFilename();
                String filePath = uploadPath + "\\" + fileName;
                File uploadFile = new File(filePath);
                file.transferTo(uploadFile);
           }
           return "success";
     }

多文件的下载

多文件下载,将要下载的文件放到一个压缩包中,给前端返回一个压缩好的文件
     @GetMapping("/downloads")
     @ResponseBody
     public ResponseEntity<byte[]>  downloadFiles(@RequestParam("names") String[] fileNames) throws  IOException{
           文件所在的文件夹地址
           String uploadPath =  "C:\\Users\\Administrator\\Desktop\\eclipse\\shua a a  kdiisjnishinishishjsuia\\springMVC_03\\WebContent\\upload";
           压缩文件的名称
           String zipFileName = "files.zip";
           输出流,参数路径为压缩文件的路径
           FileOutputStream out = new  FileOutputStream("C:\\Users\\Administrator\\Desktop\\eclipse\\shua a a kdiisjnishinishishjsuia\\springMVC_03\\WebContent\\tmp\\"  + zipFileName);
           
           ZipOutputStream zipOutputStream = new  ZipOutputStream(out);
           遍历要压缩的文件名称
           for (String fileName : fileNames) {
                //文件的路径
                String filePath = uploadPath + "\\" + fileName;
                //文件压缩之后存放的对象
                ZipEntry entry = new ZipEntry(fileName);
                //将entry'对象存放到压缩输出流中,紧接着输出,就会输出该对象中
                zipOutputStream.putNextEntry(entry);
                //读取文件在输出到entry对象中
                FileInputStream in = new  FileInputStream(filePath);
                int temp;
                while ((temp = in.read()) != -1) {
                     zipOutputStream.write(temp);
                     zipOutputStream.flush();
                     
                }
                //一次读写完成之后,关闭当前的entry,一边下一个entry能正常读写
                zipOutputStream.closeEntry();
                in.close();
           }
           zipOutputStream.close();
           
           压缩好的文件已经有了,准备下载
           设置响应头
           HttpHeaders headers = new HttpHeaders();
           headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
           headers.setContentDispositionFormData("attachment",  zipFileName);
           File zipFile = new  File("C:\\Users\\Administrator\\Desktop\\eclipse\\shua a a  kdiisjnishinishishjsuia\\springMVC_03\\WebContent\\tmp\\" +  zipFileName);
           byte[] bytes =  FileUtils.readFileToByteArray(zipFile);
           ResponseEntity<byte[]> entity = new  ResponseEntity<byte[]>(bytes,headers,HttpStatus.CREATED);
           
           return entity;
     }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值