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

直接上代码:

  // 获取项目路径
  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. ORACLE 多表关联 UPDATE 语句

    为了方便起见,建立了以下简单模型,和构造了部分测试数据: 在某个业务受理子系统BSS中, SQL 代码 --客户资料表 create table customers ( customer_id num ...

  2. MySQL学习笔记_10_MySQL高级操作(下)

    MySQL高级操作(下) 五.MySQL预处理语句 1.设置预处理stmt,传递一个数据作为where的判断条件 prepare stmt from "select * from table ...

  3. Useful Articles for the Oracle E-Business Suite Technology Stack for Technical Consultant / DBA [ID

    Applies to:  Oracle Applications Technology Stack - Version: 11.5.10.2 to 12.1.3 - Release: 11.5.10 ...

  4. Android和iOS中Cocos2D日志为什么会出现skip frames

    在你运行app在Android或iOS设备或iOS模拟器中时,日志里往往会出现一行: I/Choreographer(28956): Skipped 159 frames! The applicati ...

  5. LeetCode之“树”:Binary Tree Level Order Traversal && Binary Tree Level Order Traversal II

    Binary Tree Level Order Traversal 题目链接 题目要求: Given a binary tree, return the level order traversal o ...

  6. 菜鸟玩云计算之十七:RHEL克隆虚拟机后改变网卡地址

    菜鸟玩云计算之十七:RHEL克隆虚拟机后改变网卡地址 (一)更改hostname # vi /etc/sysconfig/network NETWORKING=yes HOSTNAME=your-vm ...

  7. 50行代码实现的一个最简单的基于 DirectShow 的视频播放器

    本文介绍一个最简单的基于 DirectShow 的视频播放器.该播放器对于初学者来说是十分有用的,它包含了使用 DirectShow 播放视频所有必备的函数. 直接贴上代码,具体代码的含义都写在注释中 ...

  8. java--加强之 jdk1.5简单新特性,枚举,注解

    转载请申明出处:http://blog.csdn.net/xmxkf/article/details/9944041 Jdk1.51新特性(静态导入,可变参数,加强for循环,自动拆装箱) 08.ja ...

  9. 面试之路(4)-TCP/IP/HTTP概述

    tcp/ip基础知识 TCP/IP全称是Transmission Control Protocol/Internet Protocol. IP地址共32位,4字节. IP地址分为两部分:网络标识和主机 ...

  10. Leetcode(59)-Count Primes

    题目: Description: Count the number of prime numbers less than a non-negative number, n. 思路: 题意:求小于给定非 ...