前言
本文主要介绍如何使用Zip4j对服务器文件进行压缩加密,通过前台调用接口,下载压缩文件
正文
前台调用
//由于ajax方式返回的是json字符,所以文件流下载不能使用ajax调用,自己组装一个form表单提交
var url = "Controller地址";
var logname = "需要下载的文件名";
$('<form/>')
.appendTo('body').attr({'id':'downloadlogs','method':'POST','action':url})
.append($('<input/>').attr({'name':'logname','value':logname,'type':'hidden'}))
$('#downloadlogs').submit();
$('#downloadlogs').remove();
后台接口
@RequestMapping(params="method=downLogs")
public void downLogs(HttpServletRequest request, HttpServletResponse response)throws Exception{
String instanceHome = "服务器文件路径";
if(StringUtil.isEmpty(request.getParameter("logname"))){
return;
}
// 拿到前台的参数-需要下载的文件名
String[] fileNames = request.getParameter("logname").split(",");
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmsssss");
// 生成压缩包文件名
String zipName = easInstanceHome + "/logs/" + ctx.getUserName() + "_log_" + sdf.format(new Date()).substring(9)+ ".zip";
// 压缩文件
boolean result = ZipUtils.zipFile(easInstanceHome + "/logs/", fileNames, zipName, ctx.getUserName()+sdf.format(new Date()).substring(0, 8));
if(!result){
JSONUtils.ERROR("下载失败", null);
return;
}
OutputStream out = null;
FileInputStream inputStream = null;
File file = new File(zipName);
try {
out = response.getOutputStream();
String filename = file.getName();
String userAgent = request.getHeader("User-Agent");
// 针对IE或者以IE为内核的浏览器:
if (userAgent.contains("MSIE") || userAgent.contains("Trident")) {
filename = java.net.URLEncoder.encode(filename, "UTF-8");
} else {
// 非IE浏览器的处理:
filename = new String(filename.getBytes("UTF-8"), "ISO-8859-1");
}
response.reset();
response.setHeader("Content-disposition","attachment; filename="+filename);
response.setContentType("application/octet-stream");
inputStream = new FileInputStream(file);
byte[] buffer = new byte[1024 * 10];
int lenth = -1;
// 通过循环将读入的Word文件的内容输出到浏览器中
while ((lenth = inputStream.read(buffer)) != -1) {
out.write(buffer, 0, lenth);
}
} catch (Exception e) {
log.error(e.getMessage(), e);
} finally {
try {
if (null != out) {
out.close();
}
if (null != inputStream) {
inputStream.close();
}
file.delete();
} catch (Exception e2) {
log.error(e2.getMessage(), e2);
}
}
}
import net.lingala.zip4j.core.ZipFile;
import net.lingala.zip4j.exception.ZipException;
import net.lingala.zip4j.model.ZipParameters;
import net.lingala.zip4j.util.Zip4jConstants;
import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;
import java.io.File;
public class ZipUtils {
private static final Logger log = Logger.getLogger(ZipUtils.class);
/**
*
* 压缩指定路径的文件
* @param srcFilePath 待压缩文件路径
* @param filesName 待压缩文件名
* @param zipPathFileName zip文件全路径名
* @param password 加密密码
* @return
*/
public static boolean zipFile(String srcFilePath, String[] filesName,String zipPathFileName, String password){
assert filesName != null;
try {
// 生成的压缩文件
ZipFile zipFile = new ZipFile(zipPathFileName);
ZipParameters parameters = new ZipParameters();
// 压缩级别
parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);
parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);
if(!StringUtils.isEmpty(password)){
parameters.setEncryptFiles(true);
parameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_AES);
parameters.setAesKeyStrength(Zip4jConstants.AES_STRENGTH_256);
parameters.setPassword(password);
}
// 要打包的文件夹
File currentFile = new File(srcFilePath);
File[] fs = currentFile.listFiles();
// 遍历文件夹下所有的文件、文件夹
for (File f : fs) {
// 判断文件是否需要下载,.lck后缀文件是系统锁定文件,不可读取
if(isInclude(filesName, f.getName()) && !f.getName().endsWith(".lck")) {
if (f.isDirectory()) {
zipFile.addFolder(f.getPath(), parameters);
} else {
zipFile.addFile(f, parameters);
}
}
}
return true;
} catch (ZipException e) {
log.error("压缩文件【"+srcFilePath+"】到路径【"+zipPathFileName+"】失败:\n"+e.getMessage(), e);
return false;
}
}
// 判断是否包含文件名,用于下载历史日志文件
private static boolean isInclude(String[] fileNames, String name){
assert fileNames != null;
for (String fileName : fileNames) {
if(name.contains(fileName)){
return true;
}
}
return false;
}
}