|
@@ -13,12 +13,12 @@ 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.zip.ZipArchiveEntry;
|
|
|
-import org.apache.commons.compress.archivers.zip.ZipFile;
|
|
|
import org.springframework.stereotype.Component;
|
|
|
|
|
|
import java.io.*;
|
|
|
import java.math.BigDecimal;
|
|
|
+import java.nio.charset.Charset;
|
|
|
+import java.nio.charset.StandardCharsets;
|
|
|
import java.text.CollationKey;
|
|
|
import java.text.Collator;
|
|
|
import java.util.*;
|
|
@@ -44,6 +44,94 @@ public class CompressFileReader {
|
|
|
this.fileHandlerService = fileHandlerService;
|
|
|
}
|
|
|
|
|
|
+ public static byte[] getUTF8BytesFromGBKString(String gbkStr) {
|
|
|
+ int n = gbkStr.length();
|
|
|
+ byte[] utfBytes = new byte[3 * n];
|
|
|
+ int k = 0;
|
|
|
+ for (int i = 0; i < n; i++) {
|
|
|
+ int m = gbkStr.charAt(i);
|
|
|
+ if (m < 128 && m >= 0) {
|
|
|
+ utfBytes[k++] = (byte) m;
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ utfBytes[k++] = (byte) (0xe0 | (m >> 12));
|
|
|
+ utfBytes[k++] = (byte) (0x80 | ((m >> 6) & 0x3f));
|
|
|
+ utfBytes[k++] = (byte) (0x80 | (m & 0x3f));
|
|
|
+ }
|
|
|
+ if (k < utfBytes.length) {
|
|
|
+ byte[] tmp = new byte[k];
|
|
|
+ System.arraycopy(utfBytes, 0, tmp, 0, k);
|
|
|
+ return tmp;
|
|
|
+ }
|
|
|
+ return utfBytes;
|
|
|
+ }
|
|
|
+
|
|
|
+ public String getUtf8String(String str) {
|
|
|
+ if (str != null && str.length() > 0) {
|
|
|
+ String needEncodeCode = "ISO-8859-1";
|
|
|
+ String neeEncodeCode = "ISO-8859-2";
|
|
|
+ String gbkEncodeCode = "GBK";
|
|
|
+ try {
|
|
|
+ if (Charset.forName(needEncodeCode).newEncoder().canEncode(str)) {
|
|
|
+ str = new String(str.getBytes(needEncodeCode), StandardCharsets.UTF_8);
|
|
|
+ }
|
|
|
+ if (Charset.forName(neeEncodeCode).newEncoder().canEncode(str)) {
|
|
|
+ str = new String(str.getBytes(neeEncodeCode), StandardCharsets.UTF_8);
|
|
|
+ }
|
|
|
+ if (Charset.forName(gbkEncodeCode).newEncoder().canEncode(str)) {
|
|
|
+ str = new String(getUTF8BytesFromGBKString(str), StandardCharsets.UTF_8);
|
|
|
+ }
|
|
|
+ } catch (UnsupportedEncodingException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return str;
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * 判断是否是中日韩文字
|
|
|
+ */
|
|
|
+ private static boolean isChinese(char c) {
|
|
|
+ Character.UnicodeBlock ub = Character.UnicodeBlock.of(c);
|
|
|
+ if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS
|
|
|
+ || ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS
|
|
|
+ || ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A
|
|
|
+ || ub == Character.UnicodeBlock.GENERAL_PUNCTUATION
|
|
|
+ || ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION
|
|
|
+ || ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ public static boolean judge(char c){
|
|
|
+ if((c >='0' && c<='9')||(c >='a' && c<='z' || c >='A' && c<='Z')){
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ public static boolean isMessyCode(String strName) {
|
|
|
+ //去除字符串中的空格 制表符 换行 回车
|
|
|
+ Pattern p = Pattern.compile("\\s*|\t*|\r*|\n*");
|
|
|
+ Matcher m = p.matcher(strName);
|
|
|
+ String after = m.replaceAll("");
|
|
|
+ //去除字符串中的标点符号
|
|
|
+ String temp = after.replaceAll("\\p{P}", "");
|
|
|
+ //处理之后转换成字符数组
|
|
|
+ char[] ch = temp.trim().toCharArray();
|
|
|
+ for (int i = 0; i < ch.length; i++) {
|
|
|
+ char c = ch[i];
|
|
|
+ //判断是否是数字或者英文字符
|
|
|
+ if (!judge(c)) {
|
|
|
+ //判断是否是中日韩文
|
|
|
+ if (!isChinese(c)) {
|
|
|
+ //如果不是数字或者英文字符也不是中日韩文则表示是乱码返回true
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //表示不是乱码 返回false
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
public String unRar(String filePath, String fileKey) {
|
|
|
Map<String, FileNode> appender = new HashMap<>();
|
|
|
List<String> imgUrls = new ArrayList<>();
|
|
@@ -91,14 +179,17 @@ public class CompressFileReader {
|
|
|
String extractPath = paths.substring(0, paths.lastIndexOf(folderName));
|
|
|
inArchive.extract(null, false, new ExtractCallback(inArchive, extractPath, folderName + "_"));
|
|
|
ISimpleInArchive simpleInArchive = inArchive.getSimpleInterface();
|
|
|
- itemPath =
|
|
|
- Arrays.stream(simpleInArchive.getArchiveItems())
|
|
|
- .map(
|
|
|
- o -> {
|
|
|
+ itemPath = Arrays.stream(simpleInArchive.getArchiveItems()).map(o -> {
|
|
|
try {
|
|
|
- return new FileHeaderRar(o.getPath(), o.isFolder());
|
|
|
+ String path = getUtf8String(o.getPath());
|
|
|
+ if (isMessyCode(path)){
|
|
|
+ path = new String(o.getPath().getBytes(StandardCharsets.ISO_8859_1), "GBK");
|
|
|
+ }
|
|
|
+ return new FileHeaderRar(path, o.isFolder());
|
|
|
} catch (SevenZipException e) {
|
|
|
e.printStackTrace();
|
|
|
+ } catch (UnsupportedEncodingException e) {
|
|
|
+ e.printStackTrace();
|
|
|
}
|
|
|
return null;
|
|
|
})
|
|
@@ -127,7 +218,6 @@ public class CompressFileReader {
|
|
|
return itemPath;
|
|
|
}
|
|
|
|
|
|
-
|
|
|
private void addNodes(Map<String, FileNode> appender, String parentName, FileNode node) {
|
|
|
if (appender.containsKey(parentName)) {
|
|
|
appender.get(parentName).getChildList().add(node);
|
|
@@ -278,51 +368,6 @@ public class CompressFileReader {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- class ZipExtractorWorker implements Runnable {
|
|
|
-
|
|
|
- private final List<Map<String, ZipArchiveEntry>> entriesToBeExtracted;
|
|
|
- private final ZipFile zipFile;
|
|
|
- private final String filePath;
|
|
|
-
|
|
|
- public ZipExtractorWorker(List<Map<String, ZipArchiveEntry>> entriesToBeExtracted, ZipFile zipFile, String filePath) {
|
|
|
- this.entriesToBeExtracted = entriesToBeExtracted;
|
|
|
- this.zipFile = zipFile;
|
|
|
- this.filePath = filePath;
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public void run() {
|
|
|
- for (Map<String, ZipArchiveEntry> entryMap : entriesToBeExtracted) {
|
|
|
- String childName = entryMap.keySet().iterator().next();
|
|
|
- ZipArchiveEntry entry = entryMap.values().iterator().next();
|
|
|
- try {
|
|
|
- extractZipFile(childName, zipFile.getInputStream(entry));
|
|
|
- } catch (IOException e) {
|
|
|
- e.printStackTrace();
|
|
|
- }
|
|
|
- }
|
|
|
- try {
|
|
|
- zipFile.close();
|
|
|
- } catch (IOException e) {
|
|
|
- e.printStackTrace();
|
|
|
- }
|
|
|
- KkFileUtils.deleteFileByPath(filePath);
|
|
|
- }
|
|
|
-
|
|
|
- private void extractZipFile(String childName, InputStream zipFile) {
|
|
|
- String outPath = fileDir + childName;
|
|
|
- try (OutputStream ot = new FileOutputStream(outPath)) {
|
|
|
- byte[] inByte = new byte[1024];
|
|
|
- int len;
|
|
|
- while ((-1 != (len = zipFile.read(inByte)))) {
|
|
|
- ot.write(inByte, 0, len);
|
|
|
- }
|
|
|
- } catch (IOException e) {
|
|
|
- e.printStackTrace();
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
class RarExtractorWorker implements Runnable {
|
|
|
private final List<Map<String, FileHeader>> headersToBeExtracted;
|
|
|
|
|
@@ -441,6 +486,5 @@ public class CompressFileReader {
|
|
|
@Override
|
|
|
public void setOperationResult(ExtractOperationResult extractOperationResult) {
|
|
|
}
|
|
|
-
|
|
|
}
|
|
|
}
|