From b1fc02cdbfb6d031973897f26839789a3f880b84 Mon Sep 17 00:00:00 2001
From: lyh <925863403@qq.com>
Date: 星期三, 25 二月 2026 13:37:02 +0800
Subject: [PATCH] 新增计算md5文件对比
---
src/main/java/com/lxzn/framework/utils/file/FileUtil.java | 148 ++++++++++++++++++++++++++++++++++++++++--------
1 files changed, 122 insertions(+), 26 deletions(-)
diff --git a/src/main/java/com/lxzn/framework/utils/file/FileUtil.java b/src/main/java/com/lxzn/framework/utils/file/FileUtil.java
index 25a40b4..a7994d9 100644
--- a/src/main/java/com/lxzn/framework/utils/file/FileUtil.java
+++ b/src/main/java/com/lxzn/framework/utils/file/FileUtil.java
@@ -16,6 +16,9 @@
import java.io.*;
import java.net.URLEncoder;
import java.nio.channels.FileChannel;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.security.MessageDigest;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@@ -306,43 +309,136 @@
}
/**
- * 澶嶅埗鏂囦欢
+ * 澶嶅埗鏂囦欢锛堝甫閲嶈瘯鍜屾牎楠�-闃叉涓鏂瑰痉澶嶅埗鏂囦欢鍑洪敊闂锛�
* @param oldPath
* @param newPath
* @param fileName
*/
public static boolean copyFile(String oldPath, String newPath, String fileName){
- oldPath = fileUploadFolder + oldPath;
- newPath = fileUploadFolder + newPath;
- File oldFile = new File(oldPath, fileName);
- File newFile = new File(newPath, fileName);
- if(oldFile.exists()){
- if(!newFile.getParentFile().exists()){
- newFile.getParentFile().mkdirs();
- }
- FileChannel inputChannel = null;
- FileChannel outputChannel = null;
- try{
- inputChannel = new FileInputStream(oldFile).getChannel();
- outputChannel = new FileOutputStream(newFile).getChannel();
- outputChannel.transferFrom(inputChannel, 0, inputChannel.size());
- return true;
- }catch (Exception e){
- log.error("澶嶅埗鏂囦欢閿欒{}", e);
- return false;
- }finally {
- try {
- inputChannel.close();
- outputChannel.close();
- }catch (Exception e){
- log.error("澶嶅埗鏂囦欢閿欒{}", e);
+ // 1. 璺緞瑙勮寖鍖�
+ String absolutePathSend = fileUploadFolder + oldPath;
+ String absolutePathTarget = fileUploadFolder + newPath;
+
+ // 2. 鍒涘缓鐩爣鏂囦欢澶�
+ File targetFolder = new File(absolutePathTarget);
+ if (!targetFolder.exists() && !targetFolder.mkdirs()) {
+ log.error("鏃犳硶鍒涘缓鐩爣鏂囦欢澶�: {}", absolutePathTarget);
+ return false;
+ }
+
+ // 3. 婧愭枃浠跺拰鐩爣鏂囦欢璺緞
+ String sourceFilePath = absolutePathSend + File.separator + fileName;
+ String targetFilePath = absolutePathTarget + File.separator + fileName;
+
+ // 4. 鑾峰彇婧愭枃浠堕鏈熷ぇ灏�
+ long expectedSize = -1;
+ File sourceFile = new File(sourceFilePath);
+ if (!sourceFile.exists()) {
+ log.error("婧愭枃浠朵笉瀛樺湪: {}", sourceFilePath);
+ return false;
+ }
+
+ try {
+ expectedSize = sourceFile.length();
+ log.info("鏂囦欢澶嶅埗: 婧�={}, 鐩爣={}, 澶у皬={}瀛楄妭", sourceFilePath, targetFilePath, expectedSize);
+ } catch (SecurityException e) {
+ log.error("鏃犳硶璁块棶婧愭枃浠�: {}", sourceFilePath, e);
+ return false;
+ }
+
+ // 5. 澶嶅埗鎿嶄綔锛堟渶澶氶噸璇�3娆★級
+ int maxRetries = 3;
+ int attempt = 0;
+ boolean copySuccess = false;
+
+ while (attempt < maxRetries && !copySuccess) {
+ attempt++;
+ try {
+ log.info("---- 寮�濮嬬{}娆″鍒跺皾璇� ----", attempt);
+
+ // 6. 鎵ц澶嶅埗鎿嶄綔
+ try (FileChannel in = new FileInputStream(sourceFilePath).getChannel();
+ FileChannel out = new FileOutputStream(targetFilePath).getChannel()) {
+ out.transferFrom(in, 0, in.size());
}
+ // 7. 鏂囦欢澶у皬楠岃瘉
+ File copiedFile = new File(targetFilePath);
+ long actualSize = copiedFile.length();
+
+ if (expectedSize != actualSize) {
+ log.warn("澶у皬涓嶄竴鑷�! 棰勬湡: {}B, 瀹為檯: {}B (宸��: {}B)",
+ expectedSize, actualSize, Math.abs(actualSize - expectedSize));
+ } else {
+ log.info("鏂囦欢澶у皬楠岃瘉鎴愬姛: {}B", actualSize);
+ copySuccess = true;
+ }
+
+ // 8. MD5鏍¢獙
+ if (copySuccess) {
+ String sourceMd5 = calculateMD5(sourceFilePath);
+ String targetMd5 = calculateMD5(targetFilePath);
+
+ if (!sourceMd5.equals(targetMd5)) {
+ log.warn("MD5涓嶄竴鑷�! 婧�: {}, 鐩爣: {}", sourceMd5, targetMd5);
+ copySuccess = false;
+ } else {
+ log.info("MD5楠岃瘉鎴愬姛");
+ }
+ }
+
+ } catch (IOException | SecurityException e) {
+ log.error("绗瑊}娆″鍒跺け璐�", attempt, e);
+ }
+
+ // 9. 閲嶈瘯闂撮殧澶勭悊
+ if (!copySuccess && attempt < maxRetries) {
+ try {
+ int delay = 200 * attempt; // 閫掑寤惰繜锛�200ms, 400ms
+ log.info("绛夊緟 {}ms 鍚庨噸璇�", delay);
+ Thread.sleep(delay);
+ } catch (InterruptedException ie) {
+ Thread.currentThread().interrupt();
+ }
}
}
- return false;
+
+ if (copySuccess) {
+ log.info("鏂囦欢澶嶅埗瀹屾垚: {}", targetFilePath);
+ } else {
+ log.error("鏂囦欢澶嶅埗澶辫触锛屽凡灏濊瘯{}娆�", maxRetries);
+ }
+
+ return copySuccess;
}
+ /**
+ * 璁$畻鏂囦欢鐨凪D5鍊�
+ * @param filePath
+ * @return
+ */
+ public static String calculateMD5(String filePath) {
+ try (InputStream is = Files.newInputStream(Paths.get(filePath))) {
+ MessageDigest md = MessageDigest.getInstance("MD5");
+ byte[] buffer = new byte[8192];
+ int read;
+
+ while ((read = is.read(buffer)) != -1) {
+ md.update(buffer, 0, read);
+ }
+
+ byte[] digest = md.digest();
+ StringBuilder sb = new StringBuilder();
+ for (byte b : digest) {
+ sb.append(String.format("%02x", b));
+ }
+ return sb.toString();
+ } catch (Exception e) {
+ throw new RuntimeException("璁$畻MD5澶辫触: " + filePath, e);
+ }
+ }
+
+
public static String getFileAbsPath(String path, String fileName){
path = fileUploadFolder + path;
File file = new File(path, fileName);
--
Gitblit v1.9.3