最近在做文件下载的功能,由于下载的是图片,内容比较大,所以需要先在服务器端进行压缩,压缩后下载到用户本地。

文件下载的步骤:

1)在服务器端建立一个临时压缩文件

2)找到文件路径,用JDK自带的API进行文件压缩

3)将zip文件下载,文件流输出

4)删除服务器端临时文件

文件下载:

@Controller
@RequestMapping(value = "${/multidownload")
public   class  MultiResouceDownload extends BaseController{@RequestMapping(value = "/downloadZip")public String downloadFiles(List<File> files,HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException {    String fileName = UUID.randomUUID().toString() + ".zip";// 在服务器端创建打包下载的临时文件String outFilePath = request.getSession().getServletContext().getRealPath("/");File fileZip = new File(outFilePath + fileName);// 文件输出流FileOutputStream outStream = new FileOutputStream(fileZip);// 压缩流ZipOutputStream zipOutStream = new ZipOutputStream(outStream);zipFile(files, zipOutStream);zipOutStream.close();outStream.close();this.downloadFile(fileZip, response, true);return null;}

循环遍历多个文件方法:

  //循环压缩多个文件public static void zipFile(List<File> files, ZipOutputStream outputStream) throws IOException, ServletException {try {int size = files.size();// 压缩列表中的文件for (int i = 0; i < size; i++) {File file = (File) files.get(i);zipFile(file, outputStream);}} catch (IOException e) {throw e;}}

文件压缩方法:

public static void zipFile(File inputFile, ZipOutputStream outputstream) throws IOException, ServletException {try {if (inputFile.exists()) {if (inputFile.isFile()) {FileInputStream inStream = new FileInputStream(inputFile);BufferedInputStream bInStream = new BufferedInputStream(inStream);ZipEntry entry = new ZipEntry(inputFile.getName());outputstream.putNextEntry(entry);final int MAX_BYTE = 10 * 1024 * 1024; // 最大的流为10Mlong streamTotal = 0; // 接受流的容量int streamNum = 0; // 流需要分开的数量int leaveByte = 0; // 文件剩下的字符数byte[] inOutbyte; // byte数组接受文件的数据streamTotal = bInStream.available(); // 通过available方法取得流的最大字符数streamNum = (int) Math.floor(streamTotal / MAX_BYTE); // 取得流文件需要分开的数量leaveByte = (int) streamTotal % MAX_BYTE; // 分开文件之后,剩余的数量if (streamNum > 0) {for (int j = 0; j < streamNum; ++j) {inOutbyte = new byte[MAX_BYTE];// 读入流,保存在byte数组bInStream.read(inOutbyte, 0, MAX_BYTE);outputstream.write(inOutbyte, 0, MAX_BYTE); // 写出流}}// 写出剩下的流数据inOutbyte = new byte[leaveByte];bInStream.read(inOutbyte, 0, leaveByte);outputstream.write(inOutbyte);outputstream.closeEntry(); // Closes the current ZIP entrybInStream.close(); // 关闭inStream.close();}} else {throw new ServletException("文件不存在!");}} catch (IOException e) {throw e;}}

总结:

上述方法就能实现文件的压缩下载,但仔细分析发现还是少一些东西,进行压缩前没有进行校验,不能验证数据的正确性,还需要进行修改,目前正在探索中。。。。

SpringMVC下压缩文件下载相关推荐

  1. 关于springmvc下服务器文件打包成zip格式下载功能

    关于springmvc下服务器文件打包成zip格式下载功能 2016年09月21日 11:22:14 toxic_guantou 阅读数:5731更多 个人分类: 技术点存储 版权声明:本文为博主原创 ...

  2. 高压缩比 压缩软件 linux,Linux下压缩软件对比

    Linux下压缩软件对比 发布时间:2007-02-15 00:44:03来源:红联作者:seais 最近在做系统备传输时发现压缩时间过常,于是简单做了一下Linux下的压缩软件的测试 源文件3591 ...

  3. linux 音频文件长度,Linux下压缩音频文件

    安装工具 sudo apt-get install lame 具体用法可以查看帮助  lame --help 通过更改音频文件的帧数 可以让文件变小  但是音质也会随之下降 现在比较多的mp3文件是1 ...

  4. 基于SpringMVC下的Rest服务框架搭建【1、集成Swagger】

    基于SpringMVC下的Rest服务框架搭建[1.集成Swagger] 1.需求背景 SpringMVC本身就可以开发出基于rest风格的服务,通过简单的配置,即可快速开发出一个可供客户端调用的re ...

  5. java实现excel文件上传_java相关:SpringMVC下实现Excel文件上传下载

    java相关:SpringMVC下实现Excel文件上传下载 发布于 2020-6-21| 复制链接 摘记: 在实际应用中,经常会遇到上传Excel或者下载Excel的情况,比如导入数据.下载统计数据 ...

  6. python 下载文件-Python实现HTTP协议下的文件下载方法总结

    本文介绍了几种常用的python下载文件的方法,具体使用到了htttplib2,urllib等包,希望对大家有帮忙. 1.简单文件下载 使用htttplib2,具体代码如下: h = httplib2 ...

  7. php压缩文件下载后损坏,php下载压缩文件

    压缩文件是正常的,但是下载到本地就提示损坏,打不开,但是随便创建一个压缩文件下载又是正常的 $froot = dirname($_SERVER['DOCUMENT_ROOT']) . '/upzip/ ...

  8. linux解压命令rar,Linux下压缩与解压命令详解

    本文为大家分享了Linux下压缩与解压缩命令,供大家参考,具体内容如下 [tar命令] 解压:tar -zxvf FileName.tar 压缩:tar -czvf FileName.tar DirN ...

  9. linux系统下 压缩和解压缩文件命令

    linux系统下 压缩和解压缩文件命令 1.把/home目录下面的mydata目录压缩为mydata.zip zip -r mydata.zip mydata #压缩mydata目录 2.把/home ...

  10. .net下进行文件下载

    .net 下进行文件下载有两种模式,下面分类进行讲解 直接通过文件所在地址进行下载 这种方法最简单,直接通过访问文件所在的网址进行下载 1.在当前页面下载 <a href="/port ...

最新文章

  1. android学习从模仿开始 —— 模仿UI 导航帖
  2. springboot+vue前后端分离实现宿舍管理系统
  3. day20-自定义分页2
  4. Leetcode 剑指 Offer 04. 二维数组中的查找 (每日一题 20210727)
  5. highcharts如何把图多余的空白页面_如何进行前端性能测试入门篇
  6. 基于Boost::beast模块的同步WebSocket服务器
  7. Nginx虚拟目录(转)
  8. ES6学习(箭头函数详解)
  9. springboot 项目maven 打包错误
  10. 关于 Failed to resolve: org.jetbrains.kotlin:kotlin-stdlib-jre7的错误
  11. matlab 设计 希尔伯特变换器,基于Matlab的FIR型希尔伯特变换器设计
  12. 修改Android模拟器的IMEI号
  13. MTCNN人脸检测与人脸对齐
  14. 如何在FLASH中实现眨眼睛的动画效果
  15. mqtt 传文件断开连接的原因_MQTT系列 | MQTT的连接和断开
  16. 解决东方财富数据接口激活后仍显示reactive的问题
  17. 变分不等式matlab,变分不等式
  18. 不收费的Word软件推荐
  19. sever and mirroring(服务器和镜像)是什么
  20. Python实现逐步回归

热门文章

  1. MSP430加密代码保护
  2. 从细节入手为您的客户创造价值
  3. 童年的李子明都长大了,你还会去买一罐旺仔牛奶吗?
  4. mobi 直接转化为 html,MobiCreator--pdf文档转化为kindle可阅读的格式
  5. 如何批量压缩pdf文件大小?
  6. Linux系统里压缩PDF文件大小
  7. 什么叫工作波长,截止波长和波导波长
  8. 计算机二级真题论文排版,计算机二级word真题:供应链的管理论文排版
  9. 巧用Excel按照某一列进行整体排序
  10. 分形--朱利亚集合图形1