|
|
@@ -13,11 +13,8 @@ import com.github.junrar.rarfile.FileHeader;
|
|
|
import net.sf.sevenzipjbinding.*;
|
|
|
import net.sf.sevenzipjbinding.impl.RandomAccessFileInStream;
|
|
|
import net.sf.sevenzipjbinding.simple.ISimpleInArchive;
|
|
|
-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.apache.commons.io.FileUtils;
|
|
|
import org.springframework.stereotype.Component;
|
|
|
|
|
|
import java.io.*;
|
|
|
@@ -47,59 +44,6 @@ public class CompressFileReader {
|
|
|
this.fileHandlerService = fileHandlerService;
|
|
|
}
|
|
|
|
|
|
- public String readZipFile(String filePath, String fileKey) {
|
|
|
- String archiveSeparator = "/";
|
|
|
- Map<String, FileNode> appender = new HashMap<>();
|
|
|
- List<String> imgUrls = new LinkedList<>();
|
|
|
- String baseUrl = BaseUrlFilter.getBaseUrl();
|
|
|
- String archiveFileName = fileHandlerService.getFileNameFromPath(filePath);
|
|
|
- try {
|
|
|
- ZipFile zipFile = new ZipFile(filePath, KkFileUtils.getFileEncode(filePath));
|
|
|
- Enumeration<ZipArchiveEntry> entries = zipFile.getEntries();
|
|
|
- // 排序
|
|
|
- entries = sortZipEntries(entries);
|
|
|
- List<Map<String, ZipArchiveEntry>> entriesToBeExtracted = new LinkedList<>();
|
|
|
- while (entries.hasMoreElements()) {
|
|
|
- ZipArchiveEntry entry = entries.nextElement();
|
|
|
- String fullName = entry.getName().replaceAll("//", "").replaceAll("\\\\", "");
|
|
|
- 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 = FileType.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 ZipExtractorWorker(entriesToBeExtracted, zipFile, filePath));
|
|
|
- fileHandlerService.putImgCache(fileKey, imgUrls);
|
|
|
- return new ObjectMapper().writeValueAsString(appender.get(""));
|
|
|
- } catch (IOException e) {
|
|
|
- e.printStackTrace();
|
|
|
- return null;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- private Enumeration<ZipArchiveEntry> sortZipEntries(Enumeration<ZipArchiveEntry> entries) {
|
|
|
- List<ZipArchiveEntry> sortedEntries = new LinkedList<>();
|
|
|
- while (entries.hasMoreElements()) {
|
|
|
- sortedEntries.add(entries.nextElement());
|
|
|
- }
|
|
|
- sortedEntries.sort(Comparator.comparingInt(o -> o.getName().length()));
|
|
|
- return Collections.enumeration(sortedEntries);
|
|
|
- }
|
|
|
-
|
|
|
public String unRar(String filePath, String fileKey) {
|
|
|
Map<String, FileNode> appender = new HashMap<>();
|
|
|
List<String> imgUrls = new ArrayList<>();
|
|
|
@@ -110,14 +54,14 @@ public class CompressFileReader {
|
|
|
List<Map<String, FileHeaderRar>> headersToBeExtract = new ArrayList<>();
|
|
|
for (FileHeaderRar header : items) {
|
|
|
String fullName = header.getFileNameW();
|
|
|
- String originName = getLastFileName(fullName, File.separator);
|
|
|
+ String originName = getLastFileName(fullName);
|
|
|
String childName = originName;
|
|
|
boolean directory = header.getDirectory();
|
|
|
if (!directory) {
|
|
|
childName = archiveFileName + "_" + originName;
|
|
|
headersToBeExtract.add(Collections.singletonMap(childName, header));
|
|
|
}
|
|
|
- String parentName = getLast2FileName(fullName, File.separator, archiveFileName);
|
|
|
+ String parentName = getLast2FileName(fullName, archiveFileName);
|
|
|
FileType type = FileType.typeFromUrl(childName);
|
|
|
if (type.equals(FileType.PICTURE)) {
|
|
|
imgUrls.add(baseUrl + childName);
|
|
|
@@ -183,58 +127,6 @@ public class CompressFileReader {
|
|
|
return itemPath;
|
|
|
}
|
|
|
|
|
|
- public String read7zFile(String filePath, String fileKey) {
|
|
|
- String archiveSeparator = "/";
|
|
|
- Map<String, FileNode> appender = new HashMap<>();
|
|
|
- List<String> imgUrls = new ArrayList<>();
|
|
|
- String baseUrl = BaseUrlFilter.getBaseUrl();
|
|
|
- String archiveFileName = fileHandlerService.getFileNameFromPath(filePath);
|
|
|
- try {
|
|
|
- SevenZFile zipFile = new SevenZFile(new File(filePath));
|
|
|
- Iterable<SevenZArchiveEntry> entries = zipFile.getEntries();
|
|
|
- // 排序
|
|
|
- Enumeration<SevenZArchiveEntry> newEntries = sortSevenZEntries(entries);
|
|
|
- List<Map<String, SevenZArchiveEntry>> entriesToBeExtracted = new ArrayList<>();
|
|
|
- while (newEntries.hasMoreElements()) {
|
|
|
- SevenZArchiveEntry entry = newEntries.nextElement();
|
|
|
- String fullName = entry.getName().replaceAll("//", "").replaceAll("\\\\", "");
|
|
|
- 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 = FileType.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));
|
|
|
- fileHandlerService.putImgCache(fileKey, imgUrls);
|
|
|
- return new ObjectMapper().writeValueAsString(appender.get(""));
|
|
|
- } catch (IOException e) {
|
|
|
- e.printStackTrace();
|
|
|
- return null;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- private Enumeration<SevenZArchiveEntry> sortSevenZEntries(Iterable<SevenZArchiveEntry> entries) {
|
|
|
- List<SevenZArchiveEntry> sortedEntries = new ArrayList<>();
|
|
|
- for (SevenZArchiveEntry entry : entries) {
|
|
|
- sortedEntries.add(entry);
|
|
|
- }
|
|
|
- return Collections.enumeration(sortedEntries);
|
|
|
- }
|
|
|
|
|
|
private void addNodes(Map<String, FileNode> appender, String parentName, FileNode node) {
|
|
|
if (appender.containsKey(parentName)) {
|
|
|
@@ -249,53 +141,28 @@ public class CompressFileReader {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- private List<FileHeader> sortedHeaders(List<FileHeader> headers) {
|
|
|
- List<FileHeader> sortedHeaders = new ArrayList<>();
|
|
|
- Map<Integer, FileHeader> mapHeaders = new TreeMap<>();
|
|
|
- headers.forEach(
|
|
|
- header ->
|
|
|
- mapHeaders.put(
|
|
|
- new Integer(0).equals(header.getFileNameW().length())
|
|
|
- ? header.getFileNameString().length()
|
|
|
- : header.getFileNameW().length(),
|
|
|
- header));
|
|
|
- for (Map.Entry<Integer, FileHeader> entry : mapHeaders.entrySet()) {
|
|
|
- for (FileHeader header : headers) {
|
|
|
- if (entry
|
|
|
- .getKey()
|
|
|
- .equals(
|
|
|
- new Integer(0).equals(header.getFileNameW().length())
|
|
|
- ? header.getFileNameString().length()
|
|
|
- : header.getFileNameW().length())) {
|
|
|
- sortedHeaders.add(header);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- return sortedHeaders;
|
|
|
- }
|
|
|
-
|
|
|
- private static String getLast2FileName(String fullName, String seperator, String rootName) {
|
|
|
- if (fullName.endsWith(seperator)) {
|
|
|
+ private static String getLast2FileName(String fullName, String rootName) {
|
|
|
+ if (fullName.endsWith(File.separator)) {
|
|
|
fullName = fullName.substring(0, fullName.length() - 1);
|
|
|
}
|
|
|
// 1.获取剩余部分
|
|
|
- int endIndex = fullName.lastIndexOf(seperator);
|
|
|
+ int endIndex = fullName.lastIndexOf(File.separator);
|
|
|
String leftPath = fullName.substring(0, endIndex == -1 ? 0 : endIndex);
|
|
|
if (leftPath.length() > 1) {
|
|
|
// 2.获取倒数第二个
|
|
|
- return getLastFileName(leftPath, seperator);
|
|
|
+ return getLastFileName(leftPath);
|
|
|
} else {
|
|
|
return rootName;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- private static String getLastFileName(String fullName, String seperator) {
|
|
|
- if (fullName.endsWith(seperator)) {
|
|
|
+ private static String getLastFileName(String fullName) {
|
|
|
+ if (fullName.endsWith(File.separator)) {
|
|
|
fullName = fullName.substring(0, fullName.length() - 1);
|
|
|
}
|
|
|
String newName = fullName;
|
|
|
- if (fullName.contains(seperator)) {
|
|
|
- newName = fullName.substring(fullName.lastIndexOf(seperator) + 1);
|
|
|
+ if (fullName.contains(File.separator)) {
|
|
|
+ newName = fullName.substring(fullName.lastIndexOf(File.separator) + 1);
|
|
|
}
|
|
|
return newName;
|
|
|
}
|
|
|
@@ -456,50 +323,6 @@ public class CompressFileReader {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- class SevenZExtractorWorker implements Runnable {
|
|
|
-
|
|
|
- private final List<Map<String, SevenZArchiveEntry>> entriesToBeExtracted;
|
|
|
- private final String filePath;
|
|
|
-
|
|
|
- public SevenZExtractorWorker(List<Map<String, SevenZArchiveEntry>> entriesToBeExtracted, String filePath) {
|
|
|
- this.entriesToBeExtracted = entriesToBeExtracted;
|
|
|
- this.filePath = filePath;
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public void run() {
|
|
|
- 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;
|
|
|
- for (Map<String, SevenZArchiveEntry> 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 (IOException e) {
|
|
|
- e.printStackTrace();
|
|
|
- }
|
|
|
- KkFileUtils.deleteFileByPath(filePath);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
class RarExtractorWorker implements Runnable {
|
|
|
private final List<Map<String, FileHeader>> headersToBeExtracted;
|
|
|
|