Java-本地文件的zip打包

package com.common.util;

import org.apache.commons.lang3.StringUtils;
import org.springframework.util.ObjectUtils;

import javax.servlet.http.HttpServletRequest;
import java.io.*;
import java.util.List;
import java.util.Map;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

/**
 * @Description 本地文件zip打包
 * @Author FangYN
 * @Date 2019/12/25
 **/
public class FileZipUtils {
    public static final String imagePath = "/upload/image/";

    /**
     * @param filepath 文件所在目录
     * @param zipPath  压缩后zip文件名称
     * @param dirFlag  zip文件中第一层是否包含一级目录,true包含;false没有
     * @Date: 2019/9/17
     * @Description: 压缩整个文件夹中的所有文件,生成指定名称的zip压缩包
     */
    private void zipMultiFile(String filepath, String zipPath, boolean dirFlag, HttpServletRequest request, List<Map> studentList) {
        ZipOutputStream zipOut = null;
        ZipOutputStream zipFaceOut = null;
        try {
            String diskPath = getUploadFilePath(request);
            File file = new File(diskPath + imagePath + filepath);// 要被压缩的文件夹
            File zipFile = new File(diskPath + imagePath + zipPath);
            zipOut = new ZipOutputStream(new FileOutputStream(zipFile));// 图片压缩文件
            File zipFaceFile = new File(diskPath + imagePath + "faceEngine_" + zipPath);
            zipFaceOut = new ZipOutputStream(new FileOutputStream(zipFaceFile));// 图片特征信息压缩文件

            if (file.isDirectory()) {
                // 图片信息打包
                File[] files = file.listFiles();
                for (File fileSec : files) {
                    int len = fileSec.getName().lastIndexOf(".");
                    String suffix = "";
                    if(len>0)
                        suffix = fileSec.getName().substring(len);
                    for (Map student : studentList) {
                        String code = student.get("CODE").toString();// 匹配编号
                        Object photo = student.get("PHOTO");
                        if (ObjectUtils.isEmpty(photo)) continue;
                        if (fileSec.getName().equals(code+ suffix)) { // 提取学生数据变动的内容图片及特征信息文件
                            String baseDir = "";
                            if (dirFlag)
                                baseDir = file.getName() + File.separator;
                            if(StringUtils.isBlank(suffix)){
                                recursionZip(zipFaceOut, fileSec, baseDir);
                            } else {
                                recursionZip(zipOut, fileSec, baseDir);
                            }
                            break;
                        }
                    }
                }
            }
            zipOut.close();
            zipFaceOut.close();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (null != zipOut) {
                try {
                    zipOut.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (null != zipFaceOut) {
                try {
                    zipFaceOut.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    private void recursionZip(ZipOutputStream zipOut, File file, String baseDir) throws Exception{
        if(file.isDirectory()){
            File[] files = file.listFiles();
            for(File fileSec:files){
                recursionZip(zipOut, fileSec, baseDir + file.getName() + File.separator);
            }
        }else{
            byte[] buf = new byte[1024];
            InputStream input = new FileInputStream(file);
            zipOut.putNextEntry(new ZipEntry(baseDir + file.getName()));
            int len;
            while((len = input.read(buf)) != -1){
                zipOut.write(buf, 0, len);
            }
            input.close();
        }
    }

    /**
     * 获取当前项目所在根目录地址
     * @param request
     * @return
     */
    private static String getUploadFilePath(HttpServletRequest request){
        String savePath = request.getSession().getServletContext().getRealPath("");
        savePath = savePath.substring(0,savePath.lastIndexOf("\\"));
        return savePath+"/";
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值