From 3f40b60c643396f75bc9835aa8a6e380dfb811d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E7=B2=BE=E5=8D=8E?= <842761733@qq.com> Date: Thu, 16 May 2019 17:44:34 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E6=8C=817z=E6=96=87=E4=BB=B6=E9=A2=84?= =?UTF-8?q?=E8=A7=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jodconverter-web/pom.xml | 6 + .../service/impl/CompressFilePreviewImpl.java | 2 + .../main/java/cn/keking/utils/ZipReader.java | 121 ++++++++++++++++++ 3 files changed, 129 insertions(+) diff --git a/jodconverter-web/pom.xml b/jodconverter-web/pom.xml index 86e1e8a0..86968b1b 100644 --- a/jodconverter-web/pom.xml +++ b/jodconverter-web/pom.xml @@ -114,6 +114,12 @@ junrar 4.0.0 + + + org.tukaani + xz + 1.8 + net.sourceforge.jchardet jchardet diff --git a/jodconverter-web/src/main/java/cn/keking/service/impl/CompressFilePreviewImpl.java b/jodconverter-web/src/main/java/cn/keking/service/impl/CompressFilePreviewImpl.java index fdca2540..1a7f7033 100644 --- a/jodconverter-web/src/main/java/cn/keking/service/impl/CompressFilePreviewImpl.java +++ b/jodconverter-web/src/main/java/cn/keking/service/impl/CompressFilePreviewImpl.java @@ -47,6 +47,8 @@ public class CompressFilePreviewImpl implements FilePreview{ fileTree = zipReader.readZipFile(filePath, fileName); } else if ("rar".equalsIgnoreCase(suffix)) { fileTree = zipReader.unRar(filePath, fileName); + } else if ("7z".equalsIgnoreCase(suffix)) { + fileTree = zipReader.read7zFile(filePath, fileName); } if (fileTree != null && !"null".equals(fileTree)) { fileUtils.addConvertedFile(fileName, fileTree); diff --git a/jodconverter-web/src/main/java/cn/keking/utils/ZipReader.java b/jodconverter-web/src/main/java/cn/keking/utils/ZipReader.java index 7eef140a..9dc78b98 100644 --- a/jodconverter-web/src/main/java/cn/keking/utils/ZipReader.java +++ b/jodconverter-web/src/main/java/cn/keking/utils/ZipReader.java @@ -9,6 +9,8 @@ import com.github.junrar.exception.RarException; import com.github.junrar.rarfile.FileHeader; import com.google.common.collect.Lists; import com.google.common.collect.Maps; +import org.apache.commons.compress.archivers.sevenz.SevenZArchiveEntry; +import org.apache.commons.compress.archivers.sevenz.SevenZFile; import org.apache.commons.compress.archivers.zip.ZipArchiveEntry; import org.apache.commons.compress.archivers.zip.ZipFile; import org.springframework.beans.factory.annotation.Autowired; @@ -160,6 +162,71 @@ public class ZipReader { return null; } + /** + * 解压7z文件 + * @param filePath + * @param fileKey + * @return + */ + public String read7zFile(String filePath,String fileKey) { + String archiveSeparator = "/"; + Map appender = Maps.newHashMap(); + List imgUrls=Lists.newArrayList(); + String baseUrl= (String) RequestContextHolder.currentRequestAttributes().getAttribute("baseUrl",0); + String archiveFileName = fileUtils.getFileNameFromPath(filePath); + try { + SevenZFile zipFile = new SevenZFile(new File(filePath)); + Iterable entries = zipFile.getEntries(); + // 排序 + Enumeration newEntries = sortSevenZEntries(entries); + List> entriesToBeExtracted = Lists.newArrayList(); + while (newEntries.hasMoreElements()){ + SevenZArchiveEntry entry = newEntries.nextElement(); + String fullName = entry.getName(); + int level = fullName.split(archiveSeparator).length; + // 展示名 + String originName = getLastFileName(fullName, archiveSeparator); + String childName = level + "_" + originName; + boolean directory = entry.isDirectory(); + if (!directory) { + childName = archiveFileName + "_" + originName; + entriesToBeExtracted.add(Collections.singletonMap(childName, entry)); + } + String parentName = getLast2FileName(fullName, archiveSeparator, archiveFileName); + parentName = (level-1) + "_" + parentName; + FileType type=fileUtils.typeFromUrl(childName); + if (type.equals(FileType.picture)){//添加图片文件到图片列表 + imgUrls.add(baseUrl+childName); + } + FileNode node = new FileNode(originName, childName, parentName, new ArrayList<>(), directory,fileKey); + addNodes(appender, parentName, node); + appender.put(childName, node); + } + // 开启新的线程处理文件解压 + executors.submit(new SevenZExtractorWorker(entriesToBeExtracted, filePath)); + fileUtils.setRedisImgUrls(fileKey,imgUrls); + return new ObjectMapper().writeValueAsString(appender.get("")); + } catch (IOException e) { + e.printStackTrace(); + return null; + } + + } + + /** + * 排序7ZEntries(对原来列表倒序) + * @param entries + */ + private Enumeration sortSevenZEntries(Iterable entries) { + List sortedEntries = Lists.newArrayList(); + Iterator iterator = entries.iterator(); + while(iterator.hasNext()){ + sortedEntries.add(iterator.next()); + } +// Collections.sort(sortedEntries, Comparator.comparingInt(o -> o.getName().length())); + return Collections.enumeration(sortedEntries); + } + private void addNodes(Map appender, String parentName, FileNode node) { if (appender.containsKey(parentName)) { appender.get(parentName).getChildList().add(node); @@ -402,6 +469,60 @@ public class ZipReader { } } + /** + * 7z文件抽取线程 + */ + class SevenZExtractorWorker implements Runnable { + + private List> entriesToBeExtracted; + private String filePath; + + public SevenZExtractorWorker(List> entriesToBeExtracted, String filePath) { + this.entriesToBeExtracted = entriesToBeExtracted; + this.filePath = filePath; + } + + @Override + public void run() { + System.out.println("解析压缩文件开始《《《《《《《《《《《《《《《《《《《《《《《"); + try { + SevenZFile sevenZFile = new SevenZFile(new File(filePath)); + SevenZArchiveEntry entry = sevenZFile.getNextEntry(); + while (entry != null) { + if (entry.isDirectory()) { + entry = sevenZFile.getNextEntry(); + continue; + } + String childName = "default_file"; + SevenZArchiveEntry entry1 = null; + for (Map entryMap : entriesToBeExtracted) { + childName = entryMap.keySet().iterator().next(); + entry1 = entryMap.values().iterator().next(); + if (entry.getName().equals(entry1.getName())) { + break; + } + } + FileOutputStream out = new FileOutputStream(fileDir + childName); + byte[] content = new byte[(int) entry.getSize()]; + sevenZFile.read(content, 0, content.length); + out.write(content); + out.close(); + entry = sevenZFile.getNextEntry(); + } + sevenZFile.close(); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + + if (new File(filePath).exists()) { + new File(filePath).delete(); + } + System.out.println("解析压缩文件结束《《《《《《《《《《《《《《《《《《《《《《《"); + } + } + /** * Rar文件抽取 */