Java解壓zip及rar


項目使用當中遇到的吭

1:rar格式壓縮包僅支持WINRAR5以下的,如果是WINRAR5+ 那么FileHeaders獲取的size就為0;

2:因為用的是springboot所以本地文件夾獲取不到路徑,因為最終要打成jar包運行在服務器的(獲取項目路徑本地是可以的,但是在linux上會出現找不到路徑)

3:文件夾傳統方式的也是無法刪除(技術有限)

package com.isky.dataservice.utils;


import java.io.File;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import com.isky.common.utils.StringUtil;
import com.isky.dataservice.utils.enums.CommonEnum;
import org.springframework.web.multipart.MultipartFile;

/**
 * 解壓文件包(zip和rar格式)
 * @param file
 */
public class UploadUtil {

    public static String path = "/home/asserts";

    /**
     * 解析上傳的壓縮文件
     *
     * @param file 上傳文件
     * @return
     * @throws Exception
     */
    public static Set<Integer> resolveCompressUploadFile(MultipartFile file) throws Exception {
        String[] pics = {"jpg", "jpeg", "png", "psd", "gif", "bmp", "tiff", "cdr", "svg"};
        String[] files = {"pdf", "txt", "text", "xlsx", "xls", "docx", "doc", "json", "xml", "csv", "rar", "zip"};
        String[] videos = {"ape", "ra", "wma", "mp3", "mp4", "wmv", "vob", "mkv", "mpe", "mpeg", "mpg", "divx", "avi", "rmvb", "rm", "asf", "mov", "flv", "3gp"};
        Map<String, String> map = null;
        if (file.isEmpty()) {
            throw new Exception(CommonEnum.FILE_NOT_NULL.getName());
        }
        String fileName = file.getOriginalFilename();
        int pos = fileName.lastIndexOf(".");
        //獲取后綴名
        String extName = fileName.substring(pos + 1).toLowerCase();

        HashSet<Integer> set = new HashSet<>();

        if (extName.equals("zip") || extName.equals("rar")) {
            String saveName = StringUtil.getUUID() + "." + extName;
            String saveFileName = saveName.substring(0, saveName.lastIndexOf("."));
            // 根據服務器的文件保存地址和原文件名創建目錄文件全路徑
            File pushFile = new File(path + "/" + saveFileName + "/" + saveName);
            File descFile = new File(path + "/" + saveFileName);
            if (!descFile.exists()) {
                descFile.mkdirs();
            }
            //解壓目的文件
            String descDir = path + "/" + saveFileName + "/";
            file.transferTo(pushFile);
            if (extName.equals("zip")) {
                map = CompressFileUtils.unZipFiles(pushFile, descDir);
            } else {
                map = CompressFileUtils.unRarFile(pushFile.getAbsolutePath(), descDir);
            }
            Set<String> strings = map.keySet();

            outer:
            for (String str : strings) {

                for (int i = 0; i < pics.length; i++) {
                    if (str.equalsIgnoreCase(pics[i])) {
                        set.add(3);
                        continue outer;
                    }
                }

                for (int i = 0; i < videos.length; i++) {
                    if (str.equalsIgnoreCase(videos[i])) {
                        set.add(5);
                        continue outer;
                    }
                }

                for (int i = 0; i < files.length; i++) {
                    if (str.equalsIgnoreCase(files[i])) {
                        set.add(4);
                        continue outer;
                    }
                }
                set.add(99);
            }
            if (descFile.exists()) {

                deleteAllFilesOfDir(descFile);

                descFile.delete();

            }
            return set;
        }

        for (String str : pics) {
            if (extName.equalsIgnoreCase(str)) {
                set.add(3);
                return set;
            }
        }

        for (String str : videos) {
            if (extName.equalsIgnoreCase(str)) {
                set.add(5);
                return set;
            }
        }

        for (String str : files) {
            if (extName.equalsIgnoreCase(str)) {
                set.add(4);
                return set;
            }
        }

        set.add(99);
        return set;
    }

    public static void deleteAllFilesOfDir(File path) {
        if (null != path) {
            if (!path.exists()) {
                return;
            }
            if (path.isFile()) {
                boolean result = path.delete();
                int count = 0;
                while (!result && count++ < 10) {
                    System.gc();
                    result = path.delete();
                }
            }
            File[] files = path.listFiles();
            if (null != files) {
                for (File f : files) {
                    deleteAllFilesOfDir(f);
                }
            }
            path.delete();
        }
    }
}

  

package com.isky.dataservice.utils;

import java.io.*;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;

import com.github.junrar.Archive;
import com.github.junrar.rarfile.FileHeader;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;

/**
 * @author Administrator
 */
public class CompressFileUtils {
    /**
     * 解壓文件到指定目錄
     *
     * @param zipFile
     * @param descDir
     */
    @SuppressWarnings("rawtypes")
    public static Map<String, String> unZipFiles(File zipFile, String descDir) throws IOException {
        Map<String, String> map = new HashMap<>();
        File pathFile = new File(descDir);
        if (!pathFile.exists()) {
            pathFile.mkdirs();
        }
        ZipFile zip = new ZipFile(zipFile, "gbk");
        for (Enumeration entries = zip.getEntries(); entries.hasMoreElements(); ) {
            ZipEntry entry = (ZipEntry) entries.nextElement();
            String zipEntryName = entry.getName();
            //判斷文件全路徑是否為文件夾,如果是上面已經上傳,不需要解壓
            if (entry.isDirectory()) {
                continue;
            }

            int i = zipEntryName.lastIndexOf(".");
            String sbu = zipEntryName.substring(i + 1);
            map.put(sbu, "1");
        }
        return map;
    }

    /**
     * 根據原始rar路徑,解壓到指定文件夾下.
     *
     * @param srcRarPath       原始rar路徑
     * @param dstDirectoryPath 解壓到的文件夾
     */
    public static Map<String, String> unRarFile(String srcRarPath, String dstDirectoryPath) throws Exception {
        Map<String, String> map = new HashMap<>();
        FileOutputStream os = null;
        File dstDiretory = new File(dstDirectoryPath);
        if (!dstDiretory.exists()) {
            dstDiretory.mkdirs();
        }
        Archive a = null;
        a = new Archive(new File(srcRarPath));
        if (a != null) {
            FileHeader fh = a.nextFileHeader();
            while (fh != null) {
                if (fh.isDirectory()) {
                    File fol = new File(dstDirectoryPath + File.separator
                            + fh.getFileNameString());
                    fol.mkdirs();
                } else {
                    File out = new File(dstDirectoryPath + File.separator
                            + fh.getFileNameString().trim());
                    String fileName = fh.getFileNameString().trim();
                    String fileType = fileName.substring(fileName.lastIndexOf(".") + 1);
                    map.put(fileType, "1");

                    if (!out.exists()) {
                        if (!out.getParentFile().exists()) {
                            out.getParentFile().mkdirs();
                        }
                        out.createNewFile();
                    }
                    os = new FileOutputStream(out);
                    a.extractFile(fh, os);
                }
                fh = a.nextFileHeader();
            }
        }
        if(os != null){
            os.close();
        }
        if(a != null){
            a.close();
        }
        return map;
    }
}

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM