解压缩zip,tar,rar,7z,提取tif,pdf中的图片

1.解压缩接口

public interface Decompress {
//curFilePreDir,压缩包中的压缩包如果跟外层文件夹,文件重名,会出现问题,加上上一层的目录前缀,可以避免
    public<MulpartFile> decompress(File file, String curFilePredir);
}

2.解压缩类实现Decompress接口

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.工厂类,根据传入的文件后缀,选择对应的压缩方法

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工具类写解压缩方法

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();
        }
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值