最近做了一些有关批量压缩下载的功能,网上也找了一些资源,但都不是太全面,所以自己整理一份,已备不时之需。

直接上代码:

  // 获取项目路径
  private static String WEBCLASS_PATH = Thread.currentThread().getContextClassLoader().getResource("").getPath();
  // 获取webinf路径
  private static String WEBINF_PATH = WEBCLASS_PATH.substring(0, WEBCLASS_PATH.lastIndexOf("classes"));
  // 获取upload路径
  private static String UPLOAD_PATH = WEBINF_PATH.substring(0, WEBINF_PATH.lastIndexOf("WEB-INF")) + "upload/";

 public void downloadAllFiles(HttpServletRequest request, HttpServletResponse response) {
// 获取要下载的文件对应的信息ID-选中文件ID拼接的字符串
String lessionIdStr = request.getParameter("fileIds");
// 第一个文件的文件名
String firstFileName = "";
List<UploadFileInfo> downLoadFiles = new LinkedList<UploadFileInfo>();
if (StringUtil.isNotEmpty(lessionIdStr)) {
int end = lessionIdStr.lastIndexOf(",");
if (end > 0) {
if (end == lessionIdStr.length() - 1) {
lessionIdStr = lessionIdStr.substring(0, end);
}
String[] ids = lessionIdStr.split(",");
for (int i = 0; i < ids.length; i++) {
// 循环获取每一个文件信息
UploadFileInfo fileInfo = uploadFileInfoService.selectByPrimaryKey(ids[i]);
if (fileInfo != null) {
downLoadFiles.add(fileInfo);
}
if (i == 0) {
firstFileName = fileInfo.getFileName().substring(0, fileInfo.getFileName().lastIndexOf("."));
}
}
}else {
// 循环获取每一个文件信息
UploadFileInfo fileInfo = uploadFileInfoService.selectByPrimaryKey(lessionIdStr);
if (fileInfo != null) {
downLoadFiles.add(fileInfo);
}
firstFileName = fileInfo.getFileName().substring(0, fileInfo.getFileName().lastIndexOf("."));
}
} // 有数据可以下载
if (downLoadFiles.size() != 0) {
// 进行预处理
preProcess(firstFileName, response);
// 压缩处理
writeZip(downLoadFiles);
// 下载文件
downFile(response);
// 删除临时压缩文件
afterProcess();
}
} // 压缩文件输出流
private ZipOutputStream out;
// 临时压缩文件存储路径
private String filePath; /**
* 描述: 预处理
* 参数: @param firseFileName 批量下载的第一个文件名
* 参数: @param response
*/
private void preProcess(String firseFileName, HttpServletResponse response) {
// 压缩文件名称
String zipName = "【批量下载】" + firseFileName + "等.zip";
filePath = UPLOAD_PATH + zipName;
try {
// 初始化压缩文件输出流
out = new ZipOutputStream(new FileOutputStream(filePath));
// 清空输出流(在迅雷下载不会出现一长窜)
response.reset();
//设置响应头和客户端保存文件名
response.setCharacterEncoding("utf-8");
response.setContentType("multipart/form-data");
// !!!new String(zipName.getBytes("GBK"), "8859_1") 如果文件包含中文,必须进行转换,否则下载后的文件名是乱码格式的
response.setHeader("Content-Disposition", "attachment;fileName=" + new String(zipName.getBytes("GBK"), "8859_1"));
} catch (IOException e) {
e.printStackTrace();
}
} /**
* 描述: 压缩处理
* 参数: @param downloadFiles 批量下载的文件数据集合
*/
private void writeZip(List<UploadFileInfo> downloadFiles) {
byte[] buf = new byte[2048];
int len = 0;
try {
for (UploadFileInfo fileInfo : downloadFiles) {
// 获取上传文件
File file = new File(UPLOAD_PATH.substring(0, UPLOAD_PATH.lastIndexOf("upload")) + fileInfo.getFilePath());
if (!file.isFile()) {
continue;
}
// 设置编码
out.setEncoding(System.getProperty("sun.jnu.encoding"));
// 设置压缩文件名称
ZipEntry ze = new ZipEntry(fileInfo.getFileName());
// 加入到输出流中
out.putNextEntry(ze);
// 对源文件进行读取并输出
FileInputStream fis = new FileInputStream(file);
while ((len = fis.read(buf)) != -1) {
out.write(buf, 0, len);
}
// 刷新(必须要有)
out.flush();
out.closeEntry();
fis.close();
}
if (out != null) {
out.close();
}
} catch (IOException e) {
e.printStackTrace();
}
} /**
* 描述: 下载临时压缩文件
* 参数: @param response
*/
private void downFile(HttpServletResponse response) {
try {
File file = new File(filePath);
if (file.exists()) {
InputStream ins = new FileInputStream(filePath);
// 放到缓冲流里面
BufferedInputStream bins = new BufferedInputStream(ins);
// 获取文件输出IO流
OutputStream outs = response.getOutputStream();
BufferedOutputStream bouts = new BufferedOutputStream(outs);
int bytesRead = 0;
byte[] buffer = new byte[1024];
// 开始向网络传输文件流
while ((bytesRead = bins.read(buffer)) != -1) {
bouts.write(buffer, 0, bytesRead);
}
// 这里一定要调用flush()方法
bouts.flush();
ins.close();
bins.close();
outs.close();
bouts.close();
}
} catch (IOException e) {
logger.error("文件下载出错", e);
}
} /**
* 描述: 删除临时压缩文件
*/
private void afterProcess() {
// 删除源文件
File tempZip=new File(filePath);
if(tempZip.exists()) {
tempZip.delete();
}
}

Java批量压缩下载的更多相关文章

  1. 用Spring中的ResponseEntity文件批量压缩下载

    我看了很多网上的demo,先生成ZIP压缩文件,然后再下载. 我这里是生成ZIP文件流 进行下载.(核心代码没多少,就是一些业务代码) @RequestMapping(value = "/& ...

  2. java批量下载

    最近做了一些有关批量压缩下载的功能,网上也找了一些资源,但都不是太全面,所以自己整理一份,已备不时之需. 直接上代码: // 获取项目路径     private static String WEBC ...

  3. Java批量文件打包下载

    经常遇到选择多个文件进行批量下载的情况,可以先将选择的所有的文件生成一个zip文件,然后再下载,该zip文件,即可实现批量下载,但是在打包过程中,常常也会出现下载过来的zip文件中里面有乱码的文件名, ...

  4. java批量解压文件夹下的所有压缩文件(.rar、.zip、.gz、.tar.gz)

    // java批量解压文件夹下的所有压缩文件(.rar..zip..gz..tar.gz) 新建工具类: package com.mobile.utils; import com.github.jun ...

  5. JAVA 实现将多目录多层级文件打成ZIP包后保留层级目录下载 ZIP压缩 下载

    将文件夹保留目录打包为 ZIP 压缩包并下载 上周做了一个需求,要求将数据库保存的 html 界面取出后将服务器下的css和js文件一起打包压缩为ZIP文件,返回给前台:在数据库中保存的是html标签 ...

  6. 完整的yuicompressor单个压缩和批量压缩以及gzip再次压缩,拦截器的配置等

    下载地址:http://yuilibrary.com/download/yuicompressor/ 个人认为现在yuicompressor是最安全,最值得信赖的压缩工具,至少到现在没出现过问题 1. ...

  7. c# 实现文件批量压缩

    今天改一个网站的功能,网站提供一些微信的素材,每个页面对应一套素材,如果会员一张一张下载,那么网站交互性就有点太差了.所以修改的内容就是提供一个按钮,点击按钮将这套图片和网站信息进行打包下载. 思路: ...

  8. uglifyjs压缩js文件(指令压缩/ 批量压缩/ 编程方式压缩)

    一.指令压缩 1.安装node,npm——详细见nodejs安装与使用入门 2.安装 uglifyjs——npm install -g uglify-js 3.压缩例子:1)uglifyjs  mai ...

  9. 一个不错的 png压缩工具 pngquant 使用介绍 批量压缩png

    1.Png 简介. 我们知道Png 有4个通道,RGBA, 多了一个表示透明的.png 有 png 32, 24, 8 等. 大致我理解的是表示颜色的多少. 数字越小,文件就越小.常见的压缩方式是导入 ...

随机推荐

  1. 学习tornado:介绍

    前言 在python里面,有许多web framework.对于我来说,因为很长一段时间都在使用tornado,所以有了一些心得体会.虽然现在我的工作重点已经转向go了,但是我觉得还是有必要记录一下t ...

  2. (NO.00001)iOS游戏SpeedBoy Lite成形记(三十):增加排行榜功能3

    在这个例子中,我们的显示代码只需要选手的名字以及对应的成绩.根据选手名字取对应的成绩可以用前面实现的playerRecord:方法,我们只需要将按照成绩排序后的选手名字返回就可以了. 我只需要再实现一 ...

  3. ORACLE sid,pid,spid总结

    概念上:1.spid (system process id)  是操作系统层面的进程id .2.pid(process id)  这个是基于oracle的进程id个人理解为就是oracle给自己的进程 ...

  4. 安卓TV开发(五) 移动智能终端UI之实现主流TV焦点可控UI

      载请标明出处:http://blog.csdn.net/sk719887916,作者:skay    由于其他网站收录,导致你无法查看本系列原创文章请点击此处 安卓TV开发(四)实现主流智能T ...

  5. 开源视频平台:ViMP

    ViMP是一个开源的视频平台,可以用于建立自己的视频门户.可以用于VoD系统,网络学习系统,企业内部视频系统的搭建. 这一阵子一直在研究网络视频平台.发现这类的开源系统相对来说还是比较少的,因此在发现 ...

  6. Ubuntu 14 安装WPS

    在32位Ubuntu 14.04 安装 WPS,WPS For Linux版除延续Windows版相同体验外,更加尊重Linux用户特定的使用习惯:深度兼容:自带方正字体集:在线模板和素材使文档创作更 ...

  7. 【Visual C++】游戏编程学习笔记之一:五毛钱特效之透明和半透明处理

    本系列文章由@二货梦想家张程 所写,转载请注明出处. 本文章链接:http://blog.csdn.net/terence1212/article/details/44163799 作者:ZeeCod ...

  8. java注解及在butternife中的实践和原理

    1.  背景 之前去一个公司,说到了java的注解,问java的注解有几种方式,然后我提到了android中的butternife和afinal注解工具,我们知道butternife在6.1版本的时候 ...

  9. Git错误一例

    Bitbucket一直不稳定,push, pull经常失效.幸好还有goagent可以用. 把git的全局配置改为走goagent代理,可以正常使用: [http] proxy = http://12 ...

  10. 关于C++“加、减机制”的整理

    今天上C++的课,杨老师提到C++继承是“加机制”的,而没有像人类进化一样采取的是“减机制”,这样会导致代码的膨胀和冗余.回来后,特地查阅了一下资料,发现这方面的文章很少. 下边的资料摘自网上及杨老师 ...