Decompress zip, tar, rar, 7z, extract pictures in tif, pdf

1. Decompression interface

public interface Decompress {
//curFilePreDir, if the compressed package in the compressed package has the same name as the outer folder or file, problems will occur. Adding the directory prefix of the upper layer can avoid it.
    public<MulpartFile> decompress(File file, String curFilePredir);
}

2. The decompression class implements the Decompress interface

public class Unzip implements Decompress {
    @Override
    public List<MultipartFile> decompress(File file, String curFilePredir){
        List<MultipartFile> res = unZip(file,curFilePredir);
        return res;
    }
}
public class UnTar implements Decompress {
    @Override
    public List<MultipartFile> decompress(File file, String curFilePredir){
        List<MultipartFile> res = unTar(file,curFilePredir);
        return res;
    }
}
public class UnRar implements Decompress {
    @Override
    public List<MultipartFile> decompress(File file, String curFilePredir){
        List<MultipartFile> res = unRar(file,curFilePredir);
        return res;
    }
}
public class Un7z implements Decompress {
    @Override
    public List<MultipartFile> decompress(File file, String curFilePredir){
        List<MultipartFile> res = un7z(file,curFilePredir);
        return res;
    }
}
public class GetImagesFromTif implements Decompress {
    @Override
    public List<MultipartFile> decompress(File file, String curFilePredir){
        List<MultipartFile> res = tifToJpg(file);
        return res;
    }
}
public class GetImagesFromPdf implements Decompress {
    @Override
    public List<MultipartFile> decompress(File file, String curFilePredir){
        List<MultipartFile> res = PdfUtil.pdf2png(file);
        return res;
    }
}

3. Factory class, selects the corresponding compression method based on the incoming file suffix.

public class DecompressFactory{
    public static Decompress getFiles(String fileSuffix){
        switch(fileSuffix){
            case "zip":
                return new Unzip();
            case "rar":
                return new UnRar();
            case "7z":
                return new Un7z();
            case "tar":
                return new UnTar();
            case "pdf":
                return new GetImagesFromPdf();
            case "tif":
                return new GetImagesFromTif();
            default:
                return null;
        }
    }
} 

4.FileUtil tool class writes decompression method

public class FileUtil{
    public static List<MultipartFile> unZip(File file, String curFilePredir){
        List<MultipartFile> res = new ArrayList<>();
        File curFile =null;
        List<File> temp = new ArrayList<>();
        try{
            @Cleanup ZipFile zipFile = new ZipFile(file,Charset.forName("GBK"));
            @Cleanup InputStream inputStream = null;
            Enumeration<? extends ZipEntry> entries = zipFile.entries();
            while(entries.hasMoreElements){
                ZipEntry zipEntry = entries.nextElement();
                String curFileName = zipEntry.getName();
                curFileName = curFilePreDir + curFileName;
                curFile = new File(curFileName);
                if(zipEntry.isDirectory()){
                    curFile.mkdir();
                    temp.add(curFile);
                    continue;
                }
                String curFileSuffix = getFileSuffix(curFileName);
                inputStream = zipFile.getInputStream(zipEntry);
                outPutToFile(inputStream,curFile);
                if(isCompress(curFileSuffix)){
                    int index = curFileName.lastIndexOf("/");
                    String tempCurFilePreDir = "";
                    if(index != -1){
                        tempCurFilePreDir = curFileName.substring(0,index + 1);
                    }
                    Decompress decompress = DecompressFactory.getFiles(curFileSuffix);
                    List<MultipartFile> list = decompress.decompress(curFile,tempCurFilePreDir);
                    res.addAll(list);
                }else{
                    MultipartFile multipartFile = fileToMultipartFile(curFile,curFileName);
                    res.add(multipartFile);
                }
                curFile.deleteOnExit();
                curFile.delete();
            }
        }catch(Exception e){
            throw new RuntimeException(e);
        }finally{
            deleteFile(temp.get(0));
        }
        return res;
    }


    public static List<MultipartFile> unRar(File file, String curFilePredir){
        List<MultipartFile> res = new ArrayList<>();
        FileHeader fileHeader = null;
        File curFile =null;
        List<File> temp = new ArrayList<>();
        try{
            @Cleanup FileInputStream fileInputStream = new FileInputStream(file);
            @Cleanup Archive archive = new Archive(fileInputStream);
            List<FileHeader> fileHeaders = archive.getFileHeaders();
            for(int i = fileHeaders.size() - 1; i>=0 ;i--){
                fileHeader = fileHeaders.get(i);
                String curFileName = fileHeader.getFileNameW().isEmpty() ? fileHeader.getFileNameString() : fileHeader.getFileNameW();
                curFileName = curFilePreDir + curFileName;
                curFile = new File(curFileName);
                if(fileHeader.isDirectory()){
                    curFile.mkdir();
                    temp.add(curFile);
                    continue;
                }
                @Cleanup FileOutPutStream fileOutputStream = new FileOutputStream(curFile);
                archive.extractFile(fileHeader,fileOutputStream);
                String curFileSuffix = getFileSuffix(curFileName);
                if(isCompress(curFileSuffix)){
                    int index = curFileName.lastIndexOf("\");
                    String tempCurFilePreDir = "";
                    if(index != -1){
                        tempCurFilePreDir = curFileName.substring(0,index + 1);
                    }
                    Decompress decompress = DecompressFactory.getFiles(curFileSuffix);
                    List<MultipartFile> list = decompress.decompress(curFile,tempCurFilePreDir);
                    res.addAll(list);
                }else{
                    MultipartFile multipartFile = fileToMultipartFile(curFile,curFileName);
                    res.add(multipartFile);
                }
                curFile.deleteOnExit();
                curFile.delete();
            }
        }catch(Exception e){
            throw new RuntimeException(e);
        }finally{
            deleteFile(temp.get(0));
        }
        return res;
    }

    public static List<MultipartFile> un7z(File file, String curFilePredir){
        List<MultipartFile> res = new ArrayList<>();
        File curFile =null;
        List<File> temp = new ArrayList<>();
        try{
            @Cleanup SenvenZFile sevenZFile = new SevenZFile(file);
            SevenZArchiveEntry nextEntry = null;
            while((nextEntry = sevenZFile.getNextEntry()) != null){
                String curFileName = nextEntry.getName();
                curFileName = curFilePreDir + curFileName;
                curFile = new File(curFileName);
                if(nextEntry.isDirectory()){
                    curFile.mkdir();
                    temp.add(curFile);
                    continue;
                }
                fileOutput(curFile,sevenZFile,nextEntry);
                String curFileSuffix = getFileSuffix(curFileName);
                inputStream = zipFile.getInputStream(zipEntry);
                outPutToFile(inputStream,curFile);
                if(isCompress(curFileSuffix)){
                    int index = curFileName.lastIndexOf("/");
                    String tempCurFilePreDir = "";
                    if(index != -1){
                        tempCurFilePreDir = curFileName.substring(0,index + 1);
                    }
                    Decompress decompress = DecompressFactory.getFiles(curFileSuffix);
                    List<MultipartFile> list = decompress.decompress(curFile,tempCurFilePreDir);
                    res.addAll(list);
                }else{
                    MultipartFile multipartFile = fileToMultipartFile(curFile,curFileName);
                    res.add(multipartFile);
                }
                curFile.deleteOnExit();
                curFile.delete();
            }
        }catch(Exception e){
            throw new RuntimeException(e);
        }finally{
            deleteFile(temp.get(0));
        }
        return res;
    }

    public static List<MultipartFile> unTar(File file, String curFilePredir){
        List<MultipartFile> res = new ArrayList<>();
        File curFile =null;
        List<File> temp = new ArrayList<>();
        try{
            @Cleanup FileInputStream fileInputStream = new FileInputStream(file);
            @Cleanup TarArchiveInputStream tarArchiveInputStream = new TarArchiveInputStream(fileInputStream);
            ArchiveEntry nextEntry = null;
            while((nextEntry = tarArchiveInputStream.getEntry()) != null){
                String curFileName = nextEntry.getName();
                curFileName = curFilePreDir + curFileName;
                curFile = new File(curFileName);
                if(nextEntry.isDirectory()){
                    curFile.mkdir();
                    temp.add(curFile);
                    continue;
                }
                tarEntryOutputToFile(curFile,tarArchiveInputStream,nextEntry);
                String curFileSuffix = getFileSuffix(curFileName);
                inputStream = zipFile.getInputStream(zipEntry);
                outPutToFile(inputStream,curFile);
                if(isCompress(curFileSuffix)){
                    int index = curFileName.lastIndexOf("/");
                    String tempCurFilePreDir = "";
                    if(index != -1){
                        tempCurFilePreDir = curFileName.substring(0,index + 1);
                    }
                    Decompress decompress = DecompressFactory.getFiles(curFileSuffix);
                    List<MultipartFile> list = decompress.decompress(curFile,tempCurFilePreDir);
                    res.addAll(list);
                }else{
                    MultipartFile multipartFile = fileToMultipartFile(curFile,curFileName);
                    res.add(multipartFile);
                }
                curFile.deleteOnExit();
                curFile.delete();
            }
        }catch(Exception e){
            throw new RuntimeException(e);
        }finally{
            deleteFile(temp.get(0));
        }
        return res;
    }

    public static String getFileSuffix(String fileName){
        String fileType = null;
        if(fileName != null){
            fileName = fileName.substring(fileName.lastIndexOf("\") + 1);
            if(fileName.lastIndexOf(".") > -1){
                fileType = (fileName.substring(fileName.lastIndexOf(".") + 1)).toLowerCase(Locale.CHINA);
            }
        }
        return fileType;
    }

    public static boolean isCompress(String curFileSuffix){
        if("zip".equals(curFileSuffix) || "rar".equals(curFileSuffix) || "tar".equals(curFileSuffix) || "7z".equals(curFileSuffix) || "pdf".equals(curFileSuffix) || "tif".equals(curFileSuffix)){
            return true;
        }else{
            return false;
        }
    }

    public static void deleteFile(File file){
        File[] files = file.listFiles();
        for(File f:files){
            if(f.siDirectory()){
                deleteFile(f);
            }else{
                f.delete();
            }
        }
        file.delete();
    }

    public static MultipartFile fileToMultipartFile(File file, String fileName){
        MultipartFile mutipartFile = null;
        try{
            @Cleanup InputStream inputStream = new FileInputStream(file);
            FileItem fileItem = new DiskFileItem(fileName,Files.probeContentType(file.toPath()),false,file.getName(),(int)file.length(),file.getParentFile());
            @Cleanup OutputStream outputStram = fileItem.getOutPutStream();
            IOUtils.copy(inputStream,outputStream);
            multipartFile = new CommonsMultipartFile(fileItem);
            return multipartFile;
        }catch(IOException e){
            throw new RuntimeException(e);
        }
    }

    public static void outPutToFile(InputStream inputStream,File file){
        try{
            @Cleanup FileOutputStream fileOutputStream = new FileOutputStream(file);
            @Cleanup BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
            int n;
            byte[] bytes = new byte[8192];
            while((n = inputStream.read(bytes)) != -1){
                bufferedOutputStream.write(bytes,0,n);
            }
        }catch(Exception e){
            throw new RunException(e);
        }
    }

    public static void fileOutput(File file, SevenZFile sevenZFile, SevenZArchiveEntry entry){
        try{
            @Cleanup FileOutputStream fileOutputStream = new FileOutputStream(file);
            byte[] content = new byte[(int)entry.getSize()];
            sevenZFile.read(content,0,content.lenth);
            fileOutputStream.write(content);
        }catch(Exception e){
            e.printStackTrace();
        }
    }

    public static void tarEntryOutputToFile(File file,TarArchiveInputStream inputStream,ArchiveEntry entry){
        try{
            @Cleanup FileOutputStream fileOutputStream = new FileOutputStream(file);
            byte[] content = new byte[(int)entry.getSize()];
            inputStream.read(content,0,content.lenth);
            fileOutputStream.write(content);
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}