瀏覽代碼

fix: 文件同时上传可能重名的bug

xsx 6 月之前
父節點
當前提交
d040f3c807

+ 18 - 25
im-platform/src/main/java/com/bx/implatform/thirdparty/MinioService.java

@@ -1,6 +1,8 @@
 package com.bx.implatform.thirdparty;
 
+import cn.hutool.core.util.RandomUtil;
 import com.bx.implatform.util.DateTimeUtils;
+import com.bx.implatform.util.FileUtil;
 import io.minio.*;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -38,9 +40,7 @@ public class MinioService {
      */
     public void makeBucket(String bucketName) {
         try {
-            minioClient.makeBucket(MakeBucketArgs.builder()
-                    .bucket(bucketName)
-                    .build());
+            minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
         } catch (Exception e) {
             log.error("创建bucket失败,", e);
         }
@@ -52,18 +52,9 @@ public class MinioService {
     public void setBucketPublic(String bucketName) {
         try {
             // 设置公开
-            String sb = "{\"Version\":\"2012-10-17\"," +
-                    "\"Statement\":[{\"Effect\":\"Allow\",\"Principal\":" +
-                    "{\"AWS\":[\"*\"]},\"Action\":[\"s3:ListBucket\",\"s3:ListBucketMultipartUploads\"," +
-                    "\"s3:GetBucketLocation\"],\"Resource\":[\"arn:aws:s3:::" + bucketName +
-                    "\"]},{\"Effect\":\"Allow\",\"Principal\":{\"AWS\":[\"*\"]},\"Action\":[\"s3:PutObject\",\"s3:AbortMultipartUpload\",\"s3:DeleteObject\",\"s3:GetObject\",\"s3:ListMultipartUploadParts\"],\"Resource\":[\"arn:aws:s3:::" +
-                    bucketName +
-                    "/*\"]}]}";
-            minioClient.setBucketPolicy(
-                    SetBucketPolicyArgs.builder()
-                            .bucket(bucketName)
-                            .config(sb)
-                            .build());
+            String sb =
+                "{\"Version\":\"2012-10-17\"," + "\"Statement\":[{\"Effect\":\"Allow\",\"Principal\":" + "{\"AWS\":[\"*\"]},\"Action\":[\"s3:ListBucket\",\"s3:ListBucketMultipartUploads\"," + "\"s3:GetBucketLocation\"],\"Resource\":[\"arn:aws:s3:::" + bucketName + "\"]},{\"Effect\":\"Allow\",\"Principal\":{\"AWS\":[\"*\"]},\"Action\":[\"s3:PutObject\",\"s3:AbortMultipartUpload\",\"s3:DeleteObject\",\"s3:GetObject\",\"s3:ListMultipartUploadParts\"],\"Resource\":[\"arn:aws:s3:::" + bucketName + "/*\"]}]}";
+            minioClient.setBucketPolicy(SetBucketPolicyArgs.builder().bucket(bucketName).config(sb).build());
         } catch (Exception e) {
             log.error("创建bucket失败,", e);
         }
@@ -82,10 +73,10 @@ public class MinioService {
         if (StringUtils.isBlank(originalFilename)) {
             throw new RuntimeException();
         }
-        String fileName = System.currentTimeMillis() + "";
-        if (originalFilename.lastIndexOf(".") >= 0) {
-            fileName += originalFilename.substring(originalFilename.lastIndexOf("."));
-        }
+        // 加入随机数,防止文件重名
+        String fileName = FileUtil.excludeExtension(originalFilename);
+        fileName += "_" + RandomUtil.randomString(4);
+        fileName += "." + FileUtil.getFileExtension(originalFilename);
         String objectName = DateTimeUtils.getFormatDate(new Date(), DateTimeUtils.PARTDATEFORMAT) + "/" + fileName;
         try {
             InputStream stream = new ByteArrayInputStream(file.getBytes());
@@ -111,13 +102,15 @@ public class MinioService {
      * @return objectName
      */
     public String upload(String bucketName, String path, String name, byte[] fileByte, String contentType) {
-
-        String fileName = System.currentTimeMillis() + name.substring(name.lastIndexOf("."));
+        // 加入随机数,防止文件重名
+        String fileName = FileUtil.excludeExtension(name);
+        fileName += "_" + RandomUtil.randomString(4);
+        fileName += "." + FileUtil.getFileExtension(name);
         String objectName = DateTimeUtils.getFormatDate(new Date(), DateTimeUtils.PARTDATEFORMAT) + "/" + fileName;
         try {
             InputStream stream = new ByteArrayInputStream(fileByte);
             PutObjectArgs objectArgs = PutObjectArgs.builder().bucket(bucketName).object(path + "/" + objectName)
-                    .stream(stream, fileByte.length, -1).contentType(contentType).build();
+                .stream(stream, fileByte.length, -1).contentType(contentType).build();
             //文件名称相同会覆盖
             minioClient.putObject(objectArgs);
         } catch (Exception e) {
@@ -127,7 +120,6 @@ public class MinioService {
         return objectName;
     }
 
-
     /**
      * 删除
      *
@@ -138,7 +130,8 @@ public class MinioService {
      */
     public boolean remove(String bucketName, String path, String fileName) {
         try {
-            minioClient.removeObject(RemoveObjectArgs.builder().bucket(bucketName).object(path + "/"  + fileName).build());
+            minioClient.removeObject(
+                RemoveObjectArgs.builder().bucket(bucketName).object(path + "/" + fileName).build());
         } catch (Exception e) {
             log.error("删除文件失败,", e);
             return false;
@@ -156,7 +149,7 @@ public class MinioService {
      */
     public Boolean isExist(String bucketName, String path, String fileName) {
         try {
-            minioClient.statObject(StatObjectArgs.builder().bucket(bucketName).object(path + "/"  + fileName).build());
+            minioClient.statObject(StatObjectArgs.builder().bucket(bucketName).object(path + "/" + fileName).build());
         } catch (Exception e) {
             return false;
         }

+ 10 - 0
im-platform/src/main/java/com/bx/implatform/util/FileUtil.java

@@ -13,6 +13,16 @@ public final class FileUtil {
         return fileName.substring(fileName.lastIndexOf(".") + 1);
     }
 
+    /**
+     *  去除文件扩展名
+     *
+     * @param fileName 文件名
+     * @return
+     */
+    public static String excludeExtension(String fileName) {
+        return fileName.substring(0,fileName.lastIndexOf("."));
+    }
+
     /**
      * 判断文件是否图片类型
      *