lyhzzz 17 часов назад
Родитель
Сommit
ca4297c47c

+ 5 - 0
4dkankan-utils-fyun-cos/src/main/java/com/fdkankan/fyun/oss/CosFileService.java

@@ -6,6 +6,7 @@ import com.alibaba.fastjson.JSON;
 import com.fdkankan.common.util.DateExtUtil;
 import com.fdkankan.fyun.constant.FYunTypeEnum;
 import com.fdkankan.fyun.face.AbstractFYunFileService;
+import com.fdkankan.fyun.util.FileInfoVo;
 import com.qcloud.cos.COSClient;
 import com.qcloud.cos.ClientConfig;
 import com.qcloud.cos.auth.BasicCOSCredentials;
@@ -533,4 +534,8 @@ public class CosFileService extends AbstractFYunFileService {
         }
     }
 
+    @Override
+    public FileInfoVo getFileInfo(String bucket, String key) {
+        return null;
+    }
 }

+ 8 - 0
4dkankan-utils-fyun-local/src/main/java/com/fdkankan/fyun/local/LocalFileService.java

@@ -13,6 +13,9 @@ import java.net.URL;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
+
+import com.fdkankan.fyun.util.FileInfoVo;
+import com.fdkankan.fyun.util.MD5Checksum;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
@@ -234,4 +237,9 @@ public class LocalFileService extends AbstractFYunFileService {
         }
         return FileUtil.loopFiles(ossPath).stream().mapToLong(File::length).sum();
     }
+
+    @Override
+    public FileInfoVo getFileInfo(String bucket, String key) {
+        return MD5Checksum.getFileInfo(getOssPath(bucket, key));
+    }
 }

+ 5 - 1
4dkankan-utils-fyun-obs/src/main/java/com/fdkankan/fyun/oss/ObsFileService.java

@@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.StrUtil;
 import com.fdkankan.fyun.constant.FYunTypeEnum;
 import com.fdkankan.fyun.face.AbstractFYunFileService;
+import com.fdkankan.fyun.util.FileInfoVo;
 import com.obs.services.ObsClient;
 import com.obs.services.model.*;
 import org.apache.http.HttpHeaders;
@@ -497,5 +498,8 @@ public class ObsFileService extends AbstractFYunFileService {
         } while (flag);
         return total;
     }
-
+    @Override
+    public FileInfoVo getFileInfo(String bucket, String key) {
+        return null;
+    }
 }

+ 32 - 3
4dkankan-utils-fyun-oss/src/main/java/com/fdkankan/fyun/oss/OssFileService.java

@@ -1,15 +1,15 @@
 package com.fdkankan.fyun.oss;
 
 import cn.hutool.core.collection.CollUtil;
-import com.alibaba.fastjson.JSON;
 import com.aliyun.oss.HttpMethod;
 import com.aliyun.oss.OSS;
 import com.aliyun.oss.OSSClientBuilder;
-import com.aliyun.oss.common.comm.ResponseMessage;
 import com.aliyun.oss.model.*;
 import com.fdkankan.common.util.FileMd5Util;
 import com.fdkankan.fyun.constant.FYunTypeEnum;
+import com.fdkankan.fyun.util.FileInfoVo;
 import com.fdkankan.fyun.face.AbstractFYunFileService;
+import com.fdkankan.fyun.util.MD5Checksum;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -17,7 +17,6 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 import org.springframework.stereotype.Component;
 import org.springframework.util.CollectionUtils;
 import org.springframework.util.ObjectUtils;
-import org.springframework.util.StringUtils;
 
 import java.io.*;
 import java.math.BigDecimal;
@@ -509,4 +508,34 @@ public class OssFileService extends AbstractFYunFileService {
         return total;
     }
 
+    @Override
+    public FileInfoVo getFileInfo(String bucket, String key) {
+        InputStream inputStream = null;
+        try {
+            GetObjectRequest getObjectMetadataRequest = new GetObjectRequest(bucket, key);
+            Date LastMo = ossClient.getObjectMetadata(getObjectMetadataRequest).getLastModified();
+            String md5 = ossClient.getObjectMetadata(getObjectMetadataRequest).getETag();
+            Long size = ossClient.getObjectMetadata(getObjectMetadataRequest).getContentLength();
+
+            inputStream = ossClient.getObject(bucket, key).getObjectContent();
+            String sha1 = MD5Checksum.getSHA1(inputStream);
+            return new FileInfoVo(md5,sha1.toUpperCase(),LastMo.getTime(),size);
+        }catch (Exception e){
+            log.info("oss-getFileInfo-error:{}",key,e);
+        }finally {
+            closeQuietly(inputStream);
+        }
+        return null;
+    }
+
+
+    private void closeQuietly(InputStream stream) {
+        if (stream != null) {
+            try {
+                stream.close();
+            } catch (IOException e) {
+                log.warn("关闭oss对象流时发生异常", e);
+            }
+        }
+    }
 }

+ 2 - 0
4dkankan-utils-fyun-parent/src/main/java/com/fdkankan/fyun/face/FYunFileServiceInterface.java

@@ -1,5 +1,6 @@
 package com.fdkankan.fyun.face;
 
+import com.fdkankan.fyun.util.FileInfoVo;
 import org.springframework.stereotype.Component;
 
 import java.io.IOException;
@@ -373,4 +374,5 @@ public interface FYunFileServiceInterface {
     public void restoreFile(String bucket, String objectName, Integer priority);
 
     public Long getSpace(String bucket, String key);
+    public FileInfoVo getFileInfo(String bucket, String key);
 }

+ 28 - 0
4dkankan-utils-fyun-parent/src/main/java/com/fdkankan/fyun/util/FileInfoVo.java

@@ -0,0 +1,28 @@
+package com.fdkankan.fyun.util;
+
+
+import cn.hutool.core.date.DateUtil;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+@AllArgsConstructor
+public class FileInfoVo {
+
+    private String MD5;
+    private String SHA1;
+    private Long lastModified;
+    private Long size;
+
+    @Override
+    public String toString() {
+        return
+                "MD5:" + MD5 + '\n' +
+                "SHA1:" + SHA1 + '\n' +
+                "修改时间:" + DateUtil.format(new Date(lastModified),"yyyy-MM-dd HH:mm:ss") +'\n' +
+                "大小:" + size +"字节"
+                ;
+    }
+}

+ 136 - 0
4dkankan-utils-fyun-parent/src/main/java/com/fdkankan/fyun/util/MD5Checksum.java

@@ -0,0 +1,136 @@
+package com.fdkankan.fyun.util;
+
+import cn.hutool.core.io.FileUtil;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.security.MessageDigest;
+
+public class MD5Checksum {
+    public static byte[] createChecksum(String filePath,String sign)  {
+        try {
+            InputStream fis = new FileInputStream(filePath);
+            byte[] buffer = new byte[1024];
+            MessageDigest complete = MessageDigest.getInstance(sign);
+            int numRead;
+
+            do {
+                numRead = fis.read(buffer);
+                if (numRead > 0) {
+                    complete.update(buffer, 0, numRead);
+                }
+            } while (numRead != -1);
+
+            fis.close();
+            return complete.digest();
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+
+        return null;
+    }
+
+    public static byte[] createChecksum(InputStream fis,String sign)  {
+        try {
+            byte[] buffer = new byte[1024];
+            MessageDigest complete = MessageDigest.getInstance(sign);
+            int numRead;
+
+            do {
+                numRead = fis.read(buffer);
+                if (numRead > 0) {
+                    complete.update(buffer, 0, numRead);
+                }
+            } while (numRead != -1);
+
+            return complete.digest();
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+
+        return null;
+    }
+
+    public static String getMD5(String filePath)  {
+        byte[] b = createChecksum(filePath,"MD5");
+        if(b == null){
+            return null;
+        }
+        StringBuilder result = new StringBuilder();
+
+        for (byte element : b) {
+            result.append(Integer.toString((element & 0xff) + 0x100, 16).substring(1));
+        }
+
+        return result.toString();
+    }
+
+    public static String getMD5(InputStream filePath)  {
+        byte[] b = createChecksum(filePath,"MD5");
+        if(b == null){
+            return null;
+        }
+        StringBuilder result = new StringBuilder();
+
+        for (byte element : b) {
+            result.append(Integer.toString((element & 0xff) + 0x100, 16).substring(1));
+        }
+
+        return result.toString();
+    }
+
+    public static String getSHA1(String filePath)  {
+        byte[] b = createChecksum(filePath,"SHA1");
+        StringBuilder result = new StringBuilder();
+        if(b == null){
+            return null;
+        }
+        for (byte element : b) {
+            result.append(Integer.toString((element & 0xff) + 0x100, 16).substring(1));
+        }
+
+        return result.toString();
+    }
+    public static String getSHA1(InputStream filePath)  {
+        byte[] b = createChecksum(filePath,"SHA1");
+        StringBuilder result = new StringBuilder();
+        if(b == null){
+            return null;
+        }
+        for (byte element : b) {
+            result.append(Integer.toString((element & 0xff) + 0x100, 16).substring(1));
+        }
+
+        return result.toString();
+    }
+
+    public static Long getLastModifiedTime(String filePath)  {
+        File file = new File(filePath);
+        return file.lastModified();
+    }
+    public static Long getSize(String filePath)  {
+        File file = new File(filePath);
+        return file.length();
+    }
+
+
+    public static FileInfoVo getFileInfo(String filePath){
+        try {
+            return new FileInfoVo(
+                    getMD5(filePath).toUpperCase(),
+                    getSHA1(filePath).toUpperCase(),
+                    getLastModifiedTime(filePath),
+                    getSize(filePath));
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    public static void main(String[] args) {
+        FileInfoVo fileInfo = getFileInfo("D:\\abc\\1.txt");
+        FileUtil.writeString(fileInfo.toString(),new File("D:\\abc\\hash.txt"),"UTF-8");
+        System.out.println();
+    }
+}

+ 59 - 0
4dkankan-utils-fyun-s3/src/main/java/com/fdkankan/fyun/s3/S3FileService.java

@@ -12,6 +12,8 @@ import com.amazonaws.services.s3.AmazonS3ClientBuilder;
 import com.amazonaws.services.s3.model.*;
 import com.fdkankan.fyun.constant.FYunTypeEnum;
 import com.fdkankan.fyun.face.AbstractFYunFileService;
+import com.fdkankan.fyun.util.FileInfoVo;
+import com.fdkankan.fyun.util.MD5Checksum;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -545,4 +547,61 @@ public class S3FileService extends AbstractFYunFileService {
             amazonS3.copyObject(request);
         });
     }
+
+    @Override
+    public FileInfoVo getFileInfo(String bucket, String key) {
+        S3Object s3Object = null;
+        S3ObjectInputStream objectInputStream = null;
+
+        try {
+            // 1. 获取文件元数据
+            GetObjectMetadataRequest metadataRequest = new GetObjectMetadataRequest(bucket, key);
+            ObjectMetadata metadata = s3.getObjectMetadata(metadataRequest);
+            Date lastModified = metadata.getLastModified();
+            String eTag = metadata.getETag();
+            Long size = metadata.getContentLength();
+            String md5 = eTag != null ? eTag.replace("\"", "") : "";
+
+            GetObjectRequest getObjectRequest = new GetObjectRequest(bucket, key);
+            s3Object = s3.getObject(getObjectRequest);
+            objectInputStream = s3Object.getObjectContent();
+
+            String sha1 = MD5Checksum.getSHA1(objectInputStream);
+
+            return new FileInfoVo(
+                    md5,
+                    sha1.toUpperCase(),
+                    lastModified.getTime(),
+                    size
+            );
+
+        } catch (Exception e) {
+            log.error("处理S3文件信息异常 - bucket:{}, key:{}", bucket, key, e);
+
+        } finally {
+            closeQuietly(objectInputStream);
+            closeQuietly(s3Object);
+        }
+        return null;
+    }
+    private void closeQuietly(S3ObjectInputStream stream) {
+        if (stream != null) {
+            try {
+                stream.close();
+            } catch (IOException e) {
+                log.warn("关闭S3对象流时发生异常", e);
+            }
+        }
+    }
+
+    private void closeQuietly(S3Object s3Object) {
+        if (s3Object != null) {
+            try {
+                s3Object.close();
+            } catch (IOException e) {
+                log.warn("关闭S3对象时发生异常", e);
+            }
+        }
+    }
+
 }