服务器文件压缩下载-Zip4j

前言

本文主要介绍如何使用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;
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值