zoukankan      html  css  js  c++  java
  • 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;
        }
    }
    

      

  • 相关阅读:
    黑马程序员面向对象09天1
    一键安装LNMP
    多屏互动技术
    阿里云CentOS 64位解决kernel2.6.32220.13.1.el6.x86_64 has missing requires错误
    listview的onItemClickListener失效
    在阿里云主机上基于CentOS用vsftpd搭建FTP服务器(赚)
    asp.net关于在线支付的实现过程
    C#关闭登录窗体,显示主窗体
    winform 刷新父窗体(转)
    用代码生成器生成的DAL数据访问操作类 基本满足需求了
  • 原文地址:https://www.cnblogs.com/appc/p/11102629.html
Copyright © 2011-2022 走看看