1. 下载压缩包zip方法

@Override
public void downloadZip(HttpServletResponse servletResponse) {
String nowTime = DateUtil.DateToString(new Date(), DateStyle.YYYYMMDDHHMMSS);
// 打包文件夹路径
String baseTempPath = "D:/downloads/zipDownTest/";
    // 定义压缩包文件名
String zipFileName = "申请表" +".zip";
// 压缩
ZipCompress compress = new ZipCompress(zipFileName, baseTempPath);
compress.zip();
// 获取压缩文件流
InputStream zipStream = new FileInputStream(new File(zipFileName));
// 下载文件名中文处理
String downZipFileName = URLEncoder.encode(zipFileName.substring(zipFileName.lastIndexOf("/") + 1), "UTF-8");
// 下载到浏览器
servletResponse.setHeader("Content-disposition", "attachment; filename*=UTF-8''" + downZipFileName);
BufferedOutputStream bufferedOs = new BufferedOutputStream(servletResponse.getOutputStream());
byte[] buffer = new byte[10240];
int bytesRead = 0;
while ((bytesRead = zipStream.read(buffer)) != -1) {
bufferedOs.write(buffer, 0, bytesRead);
}
bufferedOs.flush();
bufferedOs.close();
zipStream.close();
// 删除临时的打包文件目录和删除下载生成的临时压缩包
FileUtil.deleteDir(baseTempPath);
new File(zipFileName).delete();
}

2.文件压缩工具类

package com.talebase.cloud.cas.util.zip;
import lombok.extern.log4j.Log4j2;
import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
/**
* 文件压缩工具类
*/
@Log4j2
public class ZipCompress { private String zipFileName; // 目的地Zip文件
private String sourceFileName; // 源文件(带压缩的文件或文件夹) public ZipCompress(String zipFileName, String sourceFileName) {
this.zipFileName = zipFileName;
this.sourceFileName = sourceFileName;
} public void zip() throws Exception {
//File zipFile = new File(zipFileName);
log.info("开始压缩中...");
long begin = System.currentTimeMillis();
//创建zip输出流
File zipFile = new File(zipFileName);
if (!zipFile.exists()) {
zipFile.createNewFile();
}
ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipFileName));
//创建缓冲输出流
BufferedOutputStream bos = new BufferedOutputStream(out);
File sourceFile = new File(sourceFileName);
//调用函数
compress(out, bos, sourceFile, sourceFile.getName());
bos.close();
out.close();
long currentTimeMillis = System.currentTimeMillis();
log.info(zipFileName + "压缩完成(100%)....." + (currentTimeMillis - begin) + "ms");
} public void zipNoDirectory() throws Exception {
//File zipFile = new File(zipFileName);
log.info("开始压缩中...");
long begin = System.currentTimeMillis();
//创建zip输出流
ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipFileName));
//创建缓冲输出流
BufferedOutputStream bos = new BufferedOutputStream(out);
File sourceFile = new File(sourceFileName);
if (sourceFile.isDirectory()) {
File[] flist = sourceFile.listFiles();
for (int i = 0; i < flist.length; i++) {
compress(out, bos, flist[i], flist[i].getName());
}
}
//调用函数
// compress(out,bos,sourceFile,sourceFile.getName());
bos.close();
out.close();
long currentTimeMillis = System.currentTimeMillis();
log.info(zipFileName + "压缩完成(100%)....." + (currentTimeMillis - begin) + "ms");
} public void compress(ZipOutputStream out, BufferedOutputStream bos, File sourceFile, String base) throws Exception {
//如果路径为目录(文件夹)
if (sourceFile.isDirectory()) {
//取出文件夹中的文件(或子文件夹)
File[] flist = sourceFile.listFiles();
if (flist.length == 0) {//如果文件夹为空,则只需在目的地zip文件中写入一个目录进入点
//System.out.println("空:******"+base+"/");
out.putNextEntry(new ZipEntry(base + File.separator));
} else {//如果文件夹不为空,则递归调用compress,文件夹中的每一个文件(或文件夹)进行压缩
for (int i = 0; i < flist.length; i++) {
compress(out, bos, flist[i], base + "/" + flist[i].getName());
}
}
} else {//如果不是目录(文件夹),即为文件,则先写入目录进入点,之后将文件写入zip文件中
out.putNextEntry(new ZipEntry(base));
FileInputStream fos = new FileInputStream(sourceFile);
BufferedInputStream bis = new BufferedInputStream(fos);
int tag;
// System.out.println(base);
//将源文件写入到zip文件中
while ((tag = bis.read()) != -1) {
bos.write(tag);
}
bos.flush();
bis.close();
fos.close();
}
}
}

java 打包压缩包下载文件的更多相关文章

  1. java 的在线下载文件 .pdf

    java  的在线下载文件  .pdf 1.下载资源的本地位置 2.设置响应头 3.下载代码 1 PeriodicalResource periodicalResource = periodicalR ...

  2. 《手把手教你》系列技巧篇(五十六)-java+ selenium自动化测试-下载文件-上篇(详细教程)

    1.简介 前边几篇文章讲解完如何上传文件,既然有上传,那么就可能会有下载文件.因此宏哥就接着讲解和分享一下:自动化测试下载文件.可能有的小伙伴或者童鞋们会觉得这不是很简单吗,还用你介绍和讲解啊,不说就 ...

  3. 《手把手教你》系列技巧篇(五十七)-java+ selenium自动化测试-下载文件-下篇(详细教程)

    1.简介 前边几篇文章讲解完如何上传文件,既然有上传,那么就可能会有下载文件.因此宏哥就接着讲解和分享一下:自动化测试下载文件.可能有的小伙伴或者童鞋们会觉得这不是很简单吗,还用你介绍和讲解啊,不说就 ...

  4. Asp.Net Web Api 2 实现多文件打包并下载文件示例源码_转

    一篇关于Asp.Net Web Api下载文件的文章,之前我也写过类似的文章,请见:<ASP.NET(C#) Web Api通过文件流下载文件到本地实例>本文以这篇文章的基础,提供了Byt ...

  5. 多线程爬虫Java调用wget下载文件,独立线程读取输出缓冲区

    写了个抓取appstore的,要抓取大量的app,本来是用httpclient,但是效果不理想,于是直接调用wget下载,但是由于标准输出.错误输出的原因会导致卡住,另外wget也会莫名的卡住. 所以 ...

  6. java打包成jar文件

    JAR包是Java中所特有一种压缩文档,其实大家就可以把它理解为.zip包.当然也是有区别的,JAR包中有一个META-INF\MANIFEST.MF文件,当你找成JAR包时,它会自动生成.JAR包是 ...

  7. Java Web之下载文件

    下载的文件,不能随便的被访问,放在外面的文件夹肯定不行,url一敲就能访问了,所以我们要放在WEB-INF文件夹里面,WEB-INF文件夹只有Servlet才能访问,我们新建一个文件夹,叫downlo ...

  8. Java 从服务器下载文件到本地(页面、后台、配置都有)

    先来看实现效果: 有一个链接如下: 点击链接下载文件:  第一种方法:Servlet实现 一.HTML页面部分: 1.HTML页面中的一个链接 <a id="downloadTempl ...

  9. java 从网上下载文件的几种方式

    package com.github.pandafang.tool; import java.io.BufferedOutputStream; import java.io.File; import ...

随机推荐

  1. Python自动化准备工作(pycharm安装)

    一.安装Python 1.下载python-3.7.0-amd64.exe后双击 2.勾选Add Python3.7 to PATH可不用配置环境变量 3.点击下一步,可以按默认路径,也可以自己选择路 ...

  2. kali 安裝虛擬機VMware

    0x00前言 由於之前已經安裝過虛擬機,這次爲了寫博客又重新安裝了一邊,有些地方直接按照之前的默認的設置來了,省了設置,中間又換了一個實驗環境.完成了文章中的演示,整個過程多次實驗是沒問題的,若有疑問 ...

  3. go批量转换视频为音频

    package main import ( "bytes" "fmt" "io/ioutil" "log" " ...

  4. Jira 8.5.1 安装教程

    Jira安装教程 一.CentOS设置 1. 更换阿里源 curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/rep ...

  5. Linux操作系统的介绍和安装教程(Centos6.4)

    路漫漫其修远兮,吾将上下而求 Linux的简单介绍 Linux最初是由芬兰赫尔辛基大学学生Linus Torvalds开发的,由于自己不满意教学中使用的MINIX操作系统, 所以在1990年底由于个人 ...

  6. 建议你吃透python这68个内置函数!

    内置函数就是Python给你提供的, 拿来直接用的函数,比如print,input等. 截止到python版本3.6.2 ,一共提供了68个内置函数,具体如下 abs() dict() help() ...

  7. hasmap hashtable

    hashMap和hashtable方面的知识点吧: 1. 关于HashMap的一些说法: a) HashMap实际上是一个"链表散列"的数据结构,即数组和链表的结合体.HashMa ...

  8. java面试题目之JVM(YW制作仅供参考)

    1.JVM工作原理 2.JVM组成部分及其作用. java虚拟机分为两个子系统和两个组件. 两个子系统分别是类加载器和执行引擎,类加载器负责加载字节码(.class)文件到JVM的内存中,执行引擎负责 ...

  9. Redis【一】 RESP协议

    https://redis.io/topics/protocol RESP:redis序列化协议 client-server交流 二进制安全的 网络层 client端建立tcp连接到Server po ...

  10. Docker composer搭建Spring Cloud Alibaba 运行环境(二)

    " Spring Cloud Alibaba要用到的组件很多,注册中心nacos, 限流sentinel, 数据库,网关等等.由于用到的组件相对较多,部署会很繁琐,最关键的是没有资源服务器, ...