response = new ReturnResponse<>(0, "下载成功!!!", "");
UUID uuid = UUID.randomUUID();
if (null == fileName) {
- fileName = uuid+ "."+type;
+ fileName = uuid + "." + type;
} else { // 文件后缀不一致时,以type为准(针对simText【将类txt文件转为txt】)
fileName = fileName.replace(fileName.substring(fileName.lastIndexOf(".") + 1), type);
}
String realPath = fileDir + fileName;
File dirFile = new File(fileDir);
- if (!dirFile.exists()) {
- dirFile.mkdirs();
+ if (!dirFile.exists() && !dirFile.mkdirs()) {
+ logger.error("创建目录【{}】失败,可能是权限不够,请检查", fileDir);
}
try {
URL url = new URL(urlStr);
- if (url.getProtocol() != null && (url.getProtocol().toLowerCase().startsWith("file")||url.getProtocol().toLowerCase().startsWith("http"))) {
+ if (url.getProtocol() != null && (url.getProtocol().toLowerCase().startsWith("file") || url.getProtocol().toLowerCase().startsWith("http"))) {
byte[] bytes = getBytesFromUrl(urlStr);
OutputStream os = new FileOutputStream(realPath);
saveBytesToOutStream(bytes, os);
} else if (url.getProtocol() != null && "ftp".equalsIgnoreCase(url.getProtocol())) {
- String ftpUsername = filePreviewCommonService.getUrlParameterReg(fileAttribute.getUrl(), URL_PARAM_FTP_USERNAME);
- String ftpPassword = filePreviewCommonService.getUrlParameterReg(fileAttribute.getUrl(), URL_PARAM_FTP_PASSWORD);
- String ftpControlEncoding = filePreviewCommonService.getUrlParameterReg(fileAttribute.getUrl(), URL_PARAM_FTP_CONTROL_ENCODING);
+ String ftpUsername = fileHandlerService.getUrlParameterReg(fileAttribute.getUrl(), URL_PARAM_FTP_USERNAME);
+ String ftpPassword = fileHandlerService.getUrlParameterReg(fileAttribute.getUrl(), URL_PARAM_FTP_PASSWORD);
+ String ftpControlEncoding = fileHandlerService.getUrlParameterReg(fileAttribute.getUrl(), URL_PARAM_FTP_CONTROL_ENCODING);
FtpUtils.download(fileAttribute.getUrl(), realPath, ftpUsername, ftpPassword, ftpControlEncoding);
} else {
response.setCode(1);
@@ -73,8 +71,8 @@ public class DownloadUtils {
}
response.setContent(realPath);
response.setMsg(fileName);
- if(FileType.simText.equals(fileAttribute.getType())){
- convertTextPlainFileCharsetToUtf8(realPath);
+ if (FileType.simText.equals(fileAttribute.getType())) {
+ this.convertTextPlainFileCharsetToUtf8(realPath);
}
return response;
} catch (IOException e) {
@@ -92,17 +90,15 @@ public class DownloadUtils {
public byte[] getBytesFromUrl(String urlStr) throws IOException {
InputStream is = getInputStreamFromUrl(urlStr);
- if (is != null) {
- return getBytesFromStream(is);
- } else {
+ if (is == null) {
urlStr = URLUtil.normalize(urlStr, true, true);
is = getInputStreamFromUrl(urlStr);
if (is == null) {
logger.error("文件下载异常:url:{}", urlStr);
throw new IOException("文件下载异常:url:" + urlStr);
}
- return getBytesFromStream(is);
}
+ return getBytesFromStream(is);
}
public void saveBytesToOutStream(byte[] b, OutputStream os) throws IOException {
@@ -127,7 +123,7 @@ public class DownloadUtils {
private byte[] getBytesFromStream(InputStream is) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
- int len = 0;
+ int len;
while ((len = is.read(buffer)) != -1) {
baos.write(buffer, 0, len);
}
@@ -137,41 +133,37 @@ public class DownloadUtils {
return b;
}
- /**
- * 转换文本文件编码为utf8
- * 探测源文件编码,探测到编码切不为utf8则进行转码
- * @param filePath 文件路径
- */
- private static void convertTextPlainFileCharsetToUtf8(String filePath) throws IOException {
- File sourceFile = new File(filePath);
- if(sourceFile.exists() && sourceFile.isFile() && sourceFile.canRead()) {
- String encoding = null;
- try {
- FileCharsetDetector.Observer observer = FileCharsetDetector.guessFileEncoding(sourceFile);
- // 为准确探测到编码,不适用猜测的编码
- encoding = observer.isFound()?observer.getEncoding():null;
- // 为准确探测到编码,可以考虑使用GBK 大部分文件都是windows系统产生的
- } catch (IOException e) {
- // 编码探测失败,
- e.printStackTrace();
- }
- if(encoding != null && !"UTF-8".equals(encoding)){
- // 不为utf8,进行转码
- File tmpUtf8File = new File(filePath+".utf8");
- Writer writer = new OutputStreamWriter(new FileOutputStream(tmpUtf8File), StandardCharsets.UTF_8);
- Reader reader = new BufferedReader(new InputStreamReader(new FileInputStream(sourceFile),encoding));
- char[] buf = new char[1024];
- int read;
- while ((read = reader.read(buf)) > 0){
- writer.write(buf, 0, read);
+ /**
+ * 转换文本文件编码为utf8
+ * 探测源文件编码,探测到编码切不为utf8则进行转码
+ *
+ * @param filePath 文件路径
+ */
+ private void convertTextPlainFileCharsetToUtf8(String filePath) throws IOException {
+ File sourceFile = new File(filePath);
+ if (sourceFile.exists() && sourceFile.isFile() && sourceFile.canRead()) {
+ String encoding = FileUtils.getFileEncode(filePath);
+ if (!FileUtils.DEFAULT_FILE_ENCODING.equals(encoding)) {
+ // 不为utf8,进行转码
+ File tmpUtf8File = new File(filePath + ".utf8");
+ Writer writer = new OutputStreamWriter(new FileOutputStream(tmpUtf8File), StandardCharsets.UTF_8);
+ Reader reader = new BufferedReader(new InputStreamReader(new FileInputStream(sourceFile), encoding));
+ char[] buf = new char[1024];
+ int read;
+ while ((read = reader.read(buf)) > 0) {
+ writer.write(buf, 0, read);
+ }
+ reader.close();
+ writer.close();
+ // 删除源文件
+ if (!sourceFile.delete()) {
+ logger.error("源文件【{}】删除失败,请检查文件目录权限!", filePath);
+ }
+ // 重命名
+ if (tmpUtf8File.renameTo(sourceFile)) {
+ logger.error("临时文件【{}】重命名失败,请检查文件路径权限!", tmpUtf8File.getPath());
+ }
+ }
}
- reader.close();
- writer.close();
- // 删除源文件
- sourceFile.delete();
- // 重命名
- tmpUtf8File.renameTo(sourceFile);
- }
}
- }
}
diff --git a/server/src/main/java/cn/keking/utils/FileCharsetDetector.java b/server/src/main/java/cn/keking/utils/FileCharsetDetector.java
deleted file mode 100644
index 63bfbc6b..00000000
--- a/server/src/main/java/cn/keking/utils/FileCharsetDetector.java
+++ /dev/null
@@ -1,157 +0,0 @@
-package cn.keking.utils;
-
-import java.io.BufferedInputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-
-import org.mozilla.intl.chardet.nsDetector;
-import org.mozilla.intl.chardet.nsICharsetDetectionObserver;
-
-/**
- * 文本文件编码探测工具类
- *
- * @author HWliao
- * @date 2017-12-24
- */
-public class FileCharsetDetector {
-
- /**
- * 传入一个文件(File)对象,检查文件编码
- *
- * @param file File对象实例
- * @return 文件编码,若无,则返回null
- * @throws FileNotFoundException
- * @throws IOException
- */
- public static Observer guessFileEncoding(File file)
- throws FileNotFoundException, IOException {
- return guessFileEncoding(file, new nsDetector());
- }
-
- /**
- *
- * 获取文件的编码
- * @param file
- * File对象实例
- * @param languageHint
- * 语言提示区域代码 @see #nsPSMDetector ,取值如下:
- * 1 : Japanese
- * 2 : Chinese
- * 3 : Simplified Chinese
- * 4 : Traditional Chinese
- * 5 : Korean
- * 6 : Dont know(default)
- *
- *
- * @return 文件编码,eg:UTF-8,GBK,GB2312形式(不确定的时候,返回可能的字符编码序列);若无,则返回null
- * @throws FileNotFoundException
- * @throws IOException
- */
- public static Observer guessFileEncoding(File file, int languageHint)
- throws FileNotFoundException, IOException {
- return guessFileEncoding(file, new nsDetector(languageHint));
- }
-
- /**
- * 获取文件的编码
- *
- * @param file
- * @param det
- * @return
- * @throws FileNotFoundException
- * @throws IOException
- */
- private static Observer guessFileEncoding(File file, nsDetector det)
- throws FileNotFoundException, IOException {
- // new Observer
- Observer observer = new Observer();
- // set Observer
- // The Notify() will be called when a matching charset is found.
- det.Init(observer);
-
- BufferedInputStream imp = new BufferedInputStream(new FileInputStream(
- file));
- byte[] buf = new byte[1024];
- int len;
- boolean done = false;
- boolean isAscii = false;
-
- while ((len = imp.read(buf, 0, buf.length)) != -1) {
- // Check if the stream is only ascii.
- isAscii = det.isAscii(buf, len);
- if (isAscii) {
- break;
- }
- // DoIt if non-ascii and not done yet.
- done = det.DoIt(buf, len, false);
- if (done) {
- break;
- }
- }
- imp.close();
- det.DataEnd();
-
- if (isAscii) {
- observer.encoding = "ASCII";
- observer.found = true;
- }
-
- if (!observer.isFound()) {
- String[] prob = det.getProbableCharsets();
- // // 这里将可能的字符集组合起来返回
- // for (int i = 0; i < prob.length; i++) {
- // if (i == 0) {
- // encoding = prob[i];
- // } else {
- // encoding += "," + prob[i];
- // }
- // }
- if (prob.length > 0) {
- // 在没有发现情况下,去第一个可能的编码
- observer.encoding = prob[0];
- } else {
- observer.encoding = null;
- }
- }
- return observer;
- }
-
- /**
- * @author liaohongwei
- * @Description: 文件字符编码观察者, 但判断出字符编码时候调用
- * @date 2016年6月20日 下午2:27:06
- */
- public static class Observer implements nsICharsetDetectionObserver {
-
- /**
- * @Fields encoding : 字符编码
- */
- private String encoding = null;
- /**
- * @Fields found : 是否找到字符集
- */
- private boolean found = false;
-
- @Override
- public void Notify(String charset) {
- this.encoding = charset;
- this.found = true;
- }
-
- public String getEncoding() {
- return encoding;
- }
-
- public boolean isFound() {
- return found;
- }
-
- @Override
- public String toString() {
- return "Observer [encoding=" + encoding + ", found=" + found + "]";
- }
- }
-
-}
diff --git a/server/src/main/java/cn/keking/utils/DeleteFileUtil.java b/server/src/main/java/cn/keking/utils/FileUtils.java
similarity index 63%
rename from server/src/main/java/cn/keking/utils/DeleteFileUtil.java
rename to server/src/main/java/cn/keking/utils/FileUtils.java
index be98d07d..8c6d1894 100644
--- a/server/src/main/java/cn/keking/utils/DeleteFileUtil.java
+++ b/server/src/main/java/cn/keking/utils/FileUtils.java
@@ -1,14 +1,18 @@
package cn.keking.utils;
+import cpdetector.CharsetPrinter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
+import java.io.IOException;
import java.util.Objects;
-public class DeleteFileUtil {
+public class FileUtils {
- private static final Logger LOGGER = LoggerFactory.getLogger(DeleteFileUtil.class);
+ private static final Logger LOGGER = LoggerFactory.getLogger(FileUtils.class);
+
+ public static final String DEFAULT_FILE_ENCODING = "UTF-8";
/**
* 删除单个文件
@@ -17,7 +21,7 @@ public class DeleteFileUtil {
* 要删除的文件的文件名
* @return 单个文件删除成功返回true,否则返回false
*/
- public static boolean deleteFile(String fileName) {
+ public static boolean deleteFileByName(String fileName) {
File file = new File(fileName);
// 如果文件路径所对应的文件存在,并且是一个文件,则直接删除
if (file.exists() && file.isFile()) {
@@ -34,6 +38,36 @@ public class DeleteFileUtil {
}
}
+ /**
+ * 判断文件编码格式
+ *
+ * @param filePath 绝对路径
+ * @return 编码格式
+ */
+ public static String getFileEncode(String filePath) {
+ File file = new File(filePath);
+ CharsetPrinter cp = new CharsetPrinter();
+ try {
+ String encoding = cp.guessEncoding(file);
+ LOGGER.info("检测到文件【{}】编码: {}", filePath, encoding);
+ return encoding;
+ } catch (IOException e) {
+ LOGGER.warn("文件编码获取失败,采用默认的编码格式:UTF-8", e);
+ return DEFAULT_FILE_ENCODING;
+ }
+ }
+
+ /**
+ * 根据文件路径删除文件
+ *
+ * @param filePath 绝对路径
+ */
+ public static void deleteFileByPath(String filePath) {
+ File file = new File(filePath);
+ if (file.exists() && !file.delete()) {
+ LOGGER.warn("压缩包源文件删除失败:{}!", filePath);
+ }
+ }
/**
* 删除目录及目录下的文件
@@ -59,20 +93,20 @@ public class DeleteFileUtil {
for (int i = 0; i < Objects.requireNonNull(files).length; i++) {
// 删除子文件
if (files[i].isFile()) {
- flag = DeleteFileUtil.deleteFile(files[i].getAbsolutePath());
+ flag = FileUtils.deleteFileByName(files[i].getAbsolutePath());
if (!flag) {
break;
}
} else if (files[i].isDirectory()) {
// 删除子目录
- flag = DeleteFileUtil.deleteDirectory(files[i].getAbsolutePath());
+ flag = FileUtils.deleteDirectory(files[i].getAbsolutePath());
if (!flag) {
break;
}
}
}
- dirFile.delete();
- if (!flag) {
+
+ if (!dirFile.delete() || !flag) {
LOGGER.info("删除目录失败!");
return false;
}
diff --git a/server/src/main/java/cn/keking/utils/PdfUtils.java b/server/src/main/java/cn/keking/utils/PdfUtils.java
index 617cca32..63d9141a 100644
--- a/server/src/main/java/cn/keking/utils/PdfUtils.java
+++ b/server/src/main/java/cn/keking/utils/PdfUtils.java
@@ -1,6 +1,6 @@
package cn.keking.utils;
-import cn.keking.service.FilePreviewCommonService;
+import cn.keking.service.FileHandlerService;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.ImageType;
import org.apache.pdfbox.rendering.PDFRenderer;
@@ -23,18 +23,18 @@ public class PdfUtils {
private final Logger logger = LoggerFactory.getLogger(PdfUtils.class);
- private final FilePreviewCommonService filePreviewCommonService;
+ private final FileHandlerService fileHandlerService;
@Value("${server.tomcat.uri-encoding:UTF-8}")
private String uriEncoding;
- public PdfUtils(FilePreviewCommonService filePreviewCommonService) {
- this.filePreviewCommonService = filePreviewCommonService;
+ public PdfUtils(FileHandlerService fileHandlerService) {
+ this.fileHandlerService = fileHandlerService;
}
public List pdf2jpg(String pdfFilePath, String pdfName, String baseUrl) {
List imageUrls = new ArrayList<>();
- Integer imageCount = filePreviewCommonService.getConvertedPdfImage(pdfFilePath);
+ Integer imageCount = fileHandlerService.getConvertedPdfImage(pdfFilePath);
String imageFileSuffix = ".jpg";
String pdfFolder = pdfName.substring(0, pdfName.length() - 4);
String urlPrefix = null;
@@ -70,7 +70,7 @@ public class PdfUtils {
imageUrls.add(urlPrefix + "/" + pageIndex + imageFileSuffix);
}
doc.close();
- filePreviewCommonService.addConvertedPdfImage(pdfFilePath, pageCount);
+ fileHandlerService.addConvertedPdfImage(pdfFilePath, pageCount);
} catch (IOException e) {
logger.error("Convert pdf to jpg exception, pdfFilePath:{}", pdfFilePath, e);
}
diff --git a/server/src/main/java/cn/keking/utils/ShedulerClean.java b/server/src/main/java/cn/keking/utils/ShedulerClean.java
index 95528c8e..3c741664 100644
--- a/server/src/main/java/cn/keking/utils/ShedulerClean.java
+++ b/server/src/main/java/cn/keking/utils/ShedulerClean.java
@@ -31,7 +31,7 @@ public class ShedulerClean {
public void clean() {
logger.info("Cache clean start");
cacheService.cleanCache();
- DeleteFileUtil.deleteDirectory(fileDir);
+ FileUtils.deleteDirectory(fileDir);
logger.info("Cache clean end");
}
}
diff --git a/server/src/main/java/cn/keking/web/controller/OnlinePreviewController.java b/server/src/main/java/cn/keking/web/controller/OnlinePreviewController.java
index a2ad0a6e..ef3a67f9 100644
--- a/server/src/main/java/cn/keking/web/controller/OnlinePreviewController.java
+++ b/server/src/main/java/cn/keking/web/controller/OnlinePreviewController.java
@@ -6,7 +6,7 @@ import cn.keking.service.FilePreviewFactory;
import cn.keking.service.cache.CacheService;
import cn.keking.utils.DownloadUtils;
-import cn.keking.service.FilePreviewCommonService;
+import cn.keking.service.FileHandlerService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
@@ -32,12 +32,12 @@ public class OnlinePreviewController {
private final FilePreviewFactory previewFactory;
private final CacheService cacheService;
- private final FilePreviewCommonService filePreviewCommonService;
+ private final FileHandlerService fileHandlerService;
private final DownloadUtils downloadUtils;
- public OnlinePreviewController(FilePreviewFactory filePreviewFactory, FilePreviewCommonService filePreviewCommonService, CacheService cacheService, DownloadUtils downloadUtils) {
+ public OnlinePreviewController(FilePreviewFactory filePreviewFactory, FileHandlerService fileHandlerService, CacheService cacheService, DownloadUtils downloadUtils) {
this.previewFactory = filePreviewFactory;
- this.filePreviewCommonService = filePreviewCommonService;
+ this.fileHandlerService = fileHandlerService;
this.cacheService = cacheService;
this.downloadUtils = downloadUtils;
}
@@ -45,7 +45,7 @@ public class OnlinePreviewController {
@RequestMapping(value = "/onlinePreview")
public String onlinePreview(String url, Model model, HttpServletRequest req) {
- FileAttribute fileAttribute = filePreviewCommonService.getFileAttribute(url,req);
+ FileAttribute fileAttribute = fileHandlerService.getFileAttribute(url,req);
FilePreview filePreview = previewFactory.get(fileAttribute);
logger.info("预览文件url:{},previewType:{}", url, fileAttribute.getType());
return filePreview.filePreviewHandle(url, model, fileAttribute);