ZIP文件流压缩下载(返回给前台文件流)生成指定的临时目录,下载完后删除掉
基于springboot 项目其他项目也可以参照, window + linux 通用 先上代码:
String path = "文件绝对路径" + File.separator; // File.separator 是/的意思 这么写window +linux 通用
List<String> fileUrl = new ArrayList<>();
// 生成临时文件夹
// 例如你想生成的zip格式为 辽宁省/大连市/1.png
FileZip.filezy(path); // 文件第一层目录 path例如 D:下载文件\辽宁省
FileZip.filezy(path + "大连市" + File.separator); // 第二层文件目录 有几个就写几个
FileZip.filezy(path + "沈阳市" + File.separator); // 第二层文件目录 (如果有第三层 继续往下下排)
try { // copyFile 是copy 原来的文件到 临时目录 具体代码下面会贴出来
FileZip.copyFile("原来的文件路径","新的文件路径"); // 这里要注意新的文件路径要把文件带上 还有. 和文件类型, 例如: D:原来的文件/测试.png
fileUrl.add("新的文件路径"); //这里的路径要吧文件名换一下 因为系统存的不一定是用户输入的文件名, 一般来说是uuid 例如 D:原来的文件/zxp23%sdn2m3n%dsd.png 如果不是不用换, 如果是的话就换一下, 例如 D:原来的文件/测试.png
}catch (Exception e) {
}
// 上面是单个文件, 下面这个是多个文件处理 逻辑是一样的
for(int i = 0; i < 5; i++){ //这里需要替换成你具体循环的东西
FileZip.copyFile("原来的文件路径","新的文件路径");
fileUrl.add("新的文件路径");
}
FileZip.zipFile(fileUrl, path,req, response, "辽宁省");// 最后一个参数是最外层文件夹
// req 和response 是传入的接口上声明这两个参数 因为要返回给浏览器 HttpServletRequest req, HttpServletResponse response
File file = new File(path);
if (FileZip.deleteFile(file)) { // 这入代码是返回给浏览器后 删除掉临时文件
System.out.println("文件删除成功!");
}
下面贴出 FileZip.copyFile 代码:
/**
* 复制单个文件
* @param oldPath String 原文件路径 如:c:/fqf.txt
* @param newPath String 复制后路径 如:f:/fqf.txt
* @return boolean
*/
public static void copyFile(String oldPath, String newPath) {
try {
int bytesum = 0;
int byteread = 0;
File oldfile = new File(oldPath);
if (oldfile.exists()) { //文件存在时
InputStream inStream = new FileInputStream(oldPath); //读入原文件
FileOutputStream fs = new FileOutputStream(newPath);
byte[] buffer = new byte[1444];
int length;
while ( (byteread = inStream.read(buffer)) != -1) {
bytesum += byteread; //字节数 文件大小
System.out.println(bytesum);
fs.write(buffer, 0, byteread);
}
inStream.close();
fs.close();
}
}
catch (Exception e) {
System.out.println("复制单个文件操作出错");
e.printStackTrace();
}
}
删除临时文件的代码:
/**
* 删除文件文件
* @param file 文件
* @return
*/
public static Boolean deleteFile(File file) {
//判断文件不为null或文件目录存在
if (file == null || !file.exists()) {
System.out.println("文件删除失败,请检查文件是否存在以及文件路径是否正确");
return false;
}
//获取目录下子文件
File[] files = file.listFiles();
//遍历该目录下的文件对象
for (File f : files) {
//判断子目录是否存在子目录,如果是文件则删除
if (f.isDirectory()) {
//递归删除目录下的文件
deleteFile(f);
} else {
//文件删除
f.delete();
}
}
//文件夹删除
file.delete();
System.out.println("目录名:" + file.getName());
return true;
}
以及关键的zip流的代码:
/**
* 输出zip流文件
*
* @param fileUrl 文件名
* @param zipFileName zip文件名
* @return
*/
public static void zipFile(List<String> fileUrl, String url,HttpServletRequest req, HttpServletResponse response, String zipFileName){
BufferedOutputStream bos = null ;
FileInputStream in = null;
ZipOutputStream out = null;
try {
bos = new BufferedOutputStream(response.getOutputStream());
String userAgent = req.getHeader("User-Agent");
String formFileName = "";
// 针对IE或者以IE为内核的浏览器:
if (userAgent.contains("MSIE") || userAgent.contains("Trident")) {
formFileName = java.net.URLEncoder.encode(zipFileName, "UTF-8");
} else {
formFileName = zipFileName;
}
response.reset();
response.setContentType("application/x-msdownload");
response.setCharacterEncoding("utf-8");
// setHeader 这里要注意 不要自己改动代码 否则会返回乱码
response.setHeader("Content-Disposition", "attachment;filename=\"" + formFileName + ".zip\";filename*=utf-8''" + URLEncoder.encode(formFileName + ".zip", "UTF-8"));
out = new ZipOutputStream(bos);
File sourceFile = new File(url);
// 递归压缩文件夹
compress(sourceFile, out, sourceFile.getName());
out.flush();
out.close();
System.out.println("========= 文件压缩成功 ============");
} catch (Exception e){
e.printStackTrace();
}
}
下面贴出 用到的递归代码:
private static void compress(File sourceFile, ZipOutputStream zos, String name) throws IOException {
byte[] buf = new byte[1024];
if(sourceFile.isFile()){
// 压缩单个文件,压缩后文件名为当前文件名
zos.putNextEntry(new ZipEntry(name));
// copy文件到zip输出流中
int len;
FileInputStream in = new FileInputStream(sourceFile);
while ((len = in.read(buf)) != -1){
zos.write(buf, 0, len);
}
zos.closeEntry();
in.close();
} else {
File[] listFiles = sourceFile.listFiles();
if(listFiles == null || listFiles.length == 0){
// 空文件夹的处理(创建一个空ZipEntry)
zos.putNextEntry(new ZipEntry(name + File.separator));
zos.closeEntry();
}else {
// 递归压缩文件夹下的文件
for (File file : listFiles) {
compress(file, zos, name + File.separator + file.getName());
}
}
}
}
以上就是ZIP文件流压缩下载的全部内容,亲测可用 如果转发请注明本文地址 那就到这里吧!!