Java实现文件压缩包(zip)下载
摘要
本次主要记录将多个文件打包到zip压缩包并完成下载;留个代码方便以后用到了ctrl c v
1 多个文件打包成ZIP,下载zip包,单个文件下载
我使用的是hutool工具包的二次封装,下面直接列出工具类即可,具体API不再详述,需要详细了解的可以自行百度
注意:
1 工具类中文件参数都是以File对象接收的,如果你是远程URL下载文件的话,需要自行百度去将URL中的资源转为InputStream或者转为File对象;文章来源:https://www.toymoban.com/news/detail-509866.html
2 此工具类的downloadAnyFile方法如果使用postman测试可能还会出现文件名中文乱码问题,但是我试过使用浏览器直接请求文件名不会出现乱码问题,也尝试了设置postman的请求头和响应头都与浏览器的保持一致,但是并没有效果…文章来源地址https://www.toymoban.com/news/detail-509866.html
package mrkay.show.utils;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.io.FileTypeUtil;
import cn.hutool.core.util.ZipUtil;
import lombok.extern.slf4j.Slf4j;
import javax.activation.MimetypesFileTypeMap;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.List;
/**
* 自定义 (zip压缩包/文件) 操作工具类
*
* @author liukai
* @date 2022/7/14
*/
@Slf4j
@SuppressWarnings("all")
public class ZipFileUtils {
/**
* 生成Zip压缩包 (注意是对hutool的二次封装,所以必须要有hutool依赖)
*
* @param targetZipFile 要生成的目标zip压缩包
* @param sourceFiles 压缩包中包含的文件集合
* @param dirWithFlag 是否将文件目录一同打包进去 (true:压缩包中包含文件目录,false:压缩包中不包含目录)
* @author liukai
*/
public static void generateZip(File targetZipFile, List<File> sourceFiles, boolean dirWithFlag) {
if (CollUtil.isNotEmpty(sourceFiles)) {
File[] fileArr = sourceFiles.toArray(new File[]{});
ZipUtil.zip(targetZipFile, dirWithFlag, fileArr);
}
}
/**
* 下载ZIP压缩包(会对下载后的压缩包进行删除)
*
* @param file zip压缩包文件
* @param response 响应
* @author liukai
*/
public static void downloadZip(File file, HttpServletResponse response) {
OutputStream toClient = null;
try {
// 以流的形式下载文件。
BufferedInputStream fis = new BufferedInputStream(new FileInputStream(file.getPath()));
byte[] buffer = new byte[fis.available()];
fis.read(buffer);
fis.close();
// 清空response
response.reset();
toClient = new BufferedOutputStream(response.getOutputStream());
response.setCharacterEncoding("UTF-8");
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment;filename=" + file.getName());
toClient.write(buffer);
toClient.flush();
} catch (Exception e) {
log.error("下载zip压缩包过程发生异常:", e);
} finally {
if (toClient != null) {
try {
toClient.close();
} catch (IOException e) {
log.error("zip包下载关流失败:", e);
}
}
//删除改临时zip包(此zip包任何时候都不需要保留,因为源文件随时可以再次进行压缩生成zip包)
file.delete();
}
}
/**
* 任何单文件下载
*
* @param file 要下载的文件
* @param response 响应
* @author liukai
*/
public static void downloadAnyFile(File file, HttpServletResponse response) {
FileInputStream fileInputStream = null;
OutputStream outputStream = null;
try {
fileInputStream = new FileInputStream(file);
// 清空response
response.reset();
//防止文件名中文乱码
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(file.getName(),"UTF-8"));
//根据文件动态setContentType
response.setContentType(new MimetypesFileTypeMap().getContentType(file) + ";charset=UTF-8");
outputStream = response.getOutputStream();
byte[] bytes = new byte[2048];
int len;
while ((len = fileInputStream.read(bytes)) > 0) {
outputStream.write(bytes, 0, len);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (outputStream != null) {
try {
outputStream.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
if (fileInputStream != null) {
try {
fileInputStream.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
}
}
到了这里,关于Java实现文件下载zip包单文件等的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!