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