From aa1c7114578981463e226d4b2d7773bc1b7994da Mon Sep 17 00:00:00 2001
From: liuhaonan <konodioda2333@vip.qq.com>
Date: 星期五, 08 四月 2022 16:57:14 +0800
Subject: [PATCH] ip音柱文件上传

---
 ximon-admin/src/main/java/com/sandu/ximon/admin/minio/config/MinIoPolicy.java                   |   63 ++++
 ximon-admin/src/main/resources/application.yml                                                  |    6 
 ximon-admin/src/main/java/com/sandu/ximon/admin/minio/entity/FileSuffix.java                    |   17 +
 ximon-admin/src/main/java/com/sandu/ximon/admin/minio/config/MinIoConfig.java                   |   36 ++
 ximon-admin/src/main/java/com/sandu/ximon/admin/minio/utils/MinIoUtil.java                      |  497 +++++++++++++++++++++++++++++++++
 ximon-admin/src/main/java/com/sandu/ximon/admin/minio/BroadcastFileUtils.java                   |   31 ++
 ximon-admin/src/main/java/com/sandu/ximon/admin/controller/IpVolumeFileController.java          |   25 -
 ximon-admin/src/main/java/com/sandu/ximon/admin/minio/entity/MinIoConstant.java                 |   42 ++
 pom.xml                                                                                         |    7 
 ximon-admin/src/main/java/com/sandu/ximon/admin/service/IpVolumeMissionService.java             |   32 +
 ximon-admin/src/main/java/com/sandu/ximon/admin/minio/config/MinioPolicyStatement.java          |   17 +
 ximon-admin/src/main/resources/application-test.yml                                             |    8 
 ximon-admin/src/main/java/com/sandu/ximon/admin/minio/config/MinioPolicyStatementPrincipal.java |   11 
 ximon-admin/src/main/java/com/sandu/ximon/admin/service/IpVolumeFileService.java                |   68 +++-
 ximon-admin/src/main/resources/application-dev.yml                                              |    6 
 15 files changed, 814 insertions(+), 52 deletions(-)

diff --git a/pom.xml b/pom.xml
index b0cf6d4..22bfdd1 100644
--- a/pom.xml
+++ b/pom.xml
@@ -127,6 +127,13 @@
                 <version>3.17</version>
             </dependency>
 
+            <!-- MinIO鏈嶅姟鍣� -->
+            <dependency>
+                <groupId>io.minio</groupId>
+                <artifactId>minio</artifactId>
+                <version>7.1.0</version>
+            </dependency>
+
         </dependencies>
     </dependencyManagement>
 
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/controller/IpVolumeFileController.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/controller/IpVolumeFileController.java
index 10ac90a..ce53f53 100644
--- a/ximon-admin/src/main/java/com/sandu/ximon/admin/controller/IpVolumeFileController.java
+++ b/ximon-admin/src/main/java/com/sandu/ximon/admin/controller/IpVolumeFileController.java
@@ -4,23 +4,17 @@
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.github.pagehelper.PageHelper;
 import com.sandu.common.domain.ResponseVO;
-import com.sandu.common.enums.FileStorageEnums;
 import com.sandu.common.execption.BusinessException;
-import com.sandu.common.file.FileUploadDto;
 import com.sandu.common.file.impl.LocalFileUploadImpl;
 import com.sandu.common.object.BaseConditionVO;
 import com.sandu.common.util.ResponseUtil;
 import com.sandu.ximon.admin.param.IpVolumeFileParam;
-import com.sandu.ximon.admin.param.ReceiveParam;
 import com.sandu.ximon.admin.service.BroadcastV2TaskFileService;
 import com.sandu.ximon.admin.service.FileOperationRecordService;
 import com.sandu.ximon.admin.service.IpVolumeFileService;
 import com.sandu.ximon.dao.domain.BroadcastV2TaskFile;
-import com.sandu.ximon.dao.domain.FileOperationRecord;
 import com.sandu.ximon.dao.domain.IpVolumeFile;
-import com.sandu.ximon.dao.domain.LedSFile;
 import lombok.AllArgsConstructor;
-import org.springframework.beans.BeanUtils;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
@@ -43,21 +37,21 @@
     private final LocalFileUploadImpl fileUpload;
 
     @PostMapping("/add")
-    public ResponseVO<Object> addFile(@RequestBody @Validated IpVolumeFileParam fileParam){
+    public ResponseVO<Object> addFile(@RequestBody @Validated IpVolumeFileParam fileParam) {
         return ResponseUtil.success(ipVolumeFileService.addFile(fileParam));
     }
 
     @PostMapping("/delete/{fileId}")
-    public ResponseVO<Object> deleteFile(@PathVariable Long fileId){
+    public ResponseVO<Object> deleteFile(@PathVariable Long fileId) {
         List<BroadcastV2TaskFile> list = v2TaskFileService.list(Wrappers.lambdaQuery(BroadcastV2TaskFile.class).eq(BroadcastV2TaskFile::getFileId, fileId));
-        if(list.size()!=0){
+        if (list.size() != 0) {
             throw new BusinessException("姝ゆ枃浠舵鍦ㄨ鍏朵粬浠诲姟鍗犵敤");
         }
         return ResponseUtil.success(ipVolumeFileService.deleteFile(fileId));
     }
 
     @GetMapping("/list")
-    public ResponseVO<Object> list(BaseConditionVO baseConditionVO, @RequestParam(value = "keyword", required = false) String keyword){
+    public ResponseVO<Object> list(BaseConditionVO baseConditionVO, @RequestParam(value = "keyword", required = false) String keyword) {
         LambdaQueryWrapper<IpVolumeFile> wrapper = ipVolumeFileService.listFile(baseConditionVO, keyword);
         PageHelper.startPage(baseConditionVO.getPageNo(), baseConditionVO.getPageSize());
       /*  if (null != keyword) {
@@ -68,15 +62,6 @@
 
     @PostMapping("/IpVolumeFileUploading")
     public ResponseVO<Object> uploadingFile(@RequestParam("file") MultipartFile file) {
-        FileUploadDto fileUploadDto = fileUpload.uploadFile(file);
-
-        FileOperationRecord fileOperationRecord = new FileOperationRecord();
-//        if("mp4".equals(fileUploadDto.getFileType())){
-//            fileUploadDto.setScreenShot(fileUploadDto.getFileUrl()+"?x-oss-process=video/snapshot,t_10000,m_fast");
-//        }
-        BeanUtils.copyProperties(fileUploadDto, fileOperationRecord);
-        fileOperationRecord.setDataType(3);
-        fileOperationRecordService.save(fileOperationRecord);
-        return ResponseUtil.success(fileUploadDto);
+        return ResponseUtil.success(ipVolumeFileService.upload(file));
     }
 }
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/minio/BroadcastFileUtils.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/minio/BroadcastFileUtils.java
new file mode 100644
index 0000000..f5315ad
--- /dev/null
+++ b/ximon-admin/src/main/java/com/sandu/ximon/admin/minio/BroadcastFileUtils.java
@@ -0,0 +1,31 @@
+package com.sandu.ximon.admin.minio;
+
+import com.sandu.ximon.admin.minio.entity.FileSuffix;
+
+import java.text.DecimalFormat;
+
+public class BroadcastFileUtils {
+
+
+    /**
+     * 鍒ゆ柇鍚庣紑鍚嶆槸鍚︿竴鑷�
+     */
+    public static boolean isMp3File(String filename, FileSuffix suffix) {
+
+        String fileSuffix = filename.substring(filename.lastIndexOf(".")+1);
+
+        if(fileSuffix.equals(suffix.getSuffix())) {
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * 瀛楄妭鏁拌浆MB
+     * @param size
+     * @return
+     */
+    public static Double getMBSize(long size) {
+        return Double.valueOf(new DecimalFormat("#.00").format((size / 1024) /1024 ));
+    }
+}
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/minio/config/MinIoConfig.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/minio/config/MinIoConfig.java
new file mode 100644
index 0000000..4c51ea7
--- /dev/null
+++ b/ximon-admin/src/main/java/com/sandu/ximon/admin/minio/config/MinIoConfig.java
@@ -0,0 +1,36 @@
+package com.sandu.ximon.admin.minio.config;
+
+
+import com.sandu.ximon.admin.utils.LogUtils;
+import io.minio.MinioClient;
+import io.minio.errors.InvalidEndpointException;
+import io.minio.errors.InvalidPortException;
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.stereotype.Component;
+
+@Data
+@Component
+@ConfigurationProperties(prefix = "minio")
+public class MinIoConfig {
+
+    private String endpoint;
+
+    private int port;
+
+    private String accessKey;
+
+    private String secretKey;
+
+    private Boolean secure;
+
+    public static final String VNNOX_URL = "http://47.106.172.9:9000/";
+
+    @Bean
+    public MinioClient getMinIoClient() throws InvalidEndpointException, InvalidPortException {
+        MinioClient minioClient = new MinioClient(endpoint, port, accessKey, secretKey, secure);
+        LogUtils.print("init minio : (endpoint: " + endpoint + ")(port: " + port + ")");
+        return minioClient;
+    }
+}
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/minio/config/MinIoPolicy.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/minio/config/MinIoPolicy.java
new file mode 100644
index 0000000..a479b96
--- /dev/null
+++ b/ximon-admin/src/main/java/com/sandu/ximon/admin/minio/config/MinIoPolicy.java
@@ -0,0 +1,63 @@
+package com.sandu.ximon.admin.minio.config;
+
+import com.google.gson.Gson;
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Data
+public class MinIoPolicy {
+
+    private String Version;
+
+    private List<MinioPolicyStatement> Statement;
+
+    /**
+     * 鐢熸垚 * 閫氳绛栫暐
+     * @return
+     */
+    public static String generateMinioPolicy (String bucketName) {
+        MinIoPolicy policy = new MinIoPolicy();
+        policy.setVersion("2012-10-17");
+
+        List<MinioPolicyStatement> minioPolicyStatements = new ArrayList<>();
+        MinioPolicyStatement statement = new MinioPolicyStatement();
+        statement.setEffect("Allow");
+
+        MinioPolicyStatementPrincipal policyStatementPrincipal = new MinioPolicyStatementPrincipal();
+        List<String> aws = new ArrayList<>();
+        aws.add("*");
+        policyStatementPrincipal.setAWS(aws);
+        statement.setPrincipal(policyStatementPrincipal);
+
+        List<String> action = new ArrayList<>();
+        action.add("s3:GetBucketLocation");
+        action.add("s3:ListBucket");
+        statement.setAction(action);
+
+        List<String> resources = new ArrayList<>();
+        resources.add("arn:aws:s3:::"+bucketName);
+        statement.setResource(resources);
+
+        MinioPolicyStatement statement2 = new MinioPolicyStatement();
+        statement2.setEffect("Allow");
+        statement2.setPrincipal(policyStatementPrincipal);
+
+        action = new ArrayList<>();
+        action.add("s3:GetObject");
+        statement2.setAction(action);
+
+        resources = new ArrayList<>();
+        resources.add("arn:aws:s3:::"+bucketName+"/*");
+        statement2.setResource(resources);
+
+        minioPolicyStatements.add(statement);
+        minioPolicyStatements.add(statement2);
+
+        policy.setStatement(minioPolicyStatements);
+
+        return new Gson().toJson(policy);
+    }
+
+}
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/minio/config/MinioPolicyStatement.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/minio/config/MinioPolicyStatement.java
new file mode 100644
index 0000000..2b3171e
--- /dev/null
+++ b/ximon-admin/src/main/java/com/sandu/ximon/admin/minio/config/MinioPolicyStatement.java
@@ -0,0 +1,17 @@
+package com.sandu.ximon.admin.minio.config;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class MinioPolicyStatement {
+
+    private String Effect;
+
+    private MinioPolicyStatementPrincipal Principal;
+
+    private List<String> Action;
+
+    private List<String> Resource;
+}
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/minio/config/MinioPolicyStatementPrincipal.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/minio/config/MinioPolicyStatementPrincipal.java
new file mode 100644
index 0000000..1c7c504
--- /dev/null
+++ b/ximon-admin/src/main/java/com/sandu/ximon/admin/minio/config/MinioPolicyStatementPrincipal.java
@@ -0,0 +1,11 @@
+package com.sandu.ximon.admin.minio.config;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class MinioPolicyStatementPrincipal {
+
+    private List<String> AWS;
+}
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/minio/entity/FileSuffix.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/minio/entity/FileSuffix.java
new file mode 100644
index 0000000..60f35f6
--- /dev/null
+++ b/ximon-admin/src/main/java/com/sandu/ximon/admin/minio/entity/FileSuffix.java
@@ -0,0 +1,17 @@
+package com.sandu.ximon.admin.minio.entity;
+
+public enum FileSuffix {
+
+    MP3("mp3"),
+
+    ;
+
+    FileSuffix(String suffix){
+        this.suffix = suffix;
+    }
+    private String suffix;
+
+    public String getSuffix() {
+        return suffix;
+    }
+}
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/minio/entity/MinIoConstant.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/minio/entity/MinIoConstant.java
new file mode 100644
index 0000000..82f36fd
--- /dev/null
+++ b/ximon-admin/src/main/java/com/sandu/ximon/admin/minio/entity/MinIoConstant.java
@@ -0,0 +1,42 @@
+package com.sandu.ximon.admin.minio.entity;
+
+public enum MinIoConstant {
+
+    //  log
+    LOG("log",0),
+    //  娴嬭瘯鏂囦欢妗�
+    TEST("test", 1),
+    //  涓插彛鏂囦欢妗跺墠缂�
+    MAIN_BOARD_REMOTE_UPDATE_FILE("remote-update.", 2),
+    //  闊虫煴鏂囦欢妗跺墠缂�
+    BROADCAST_FILE("ipvolume.", 3),
+    //  绠$悊鍛橀煶鏌辨枃浠舵《鍓嶇紑
+    ADMIN_BROADCAST_FILE("adminipvolume", 3)
+
+    ;
+
+    MinIoConstant(String bucketName, Integer type){
+        this.bucketName = bucketName;
+        this.type = type;
+    }
+    private String bucketName;
+
+    private Integer type;
+
+    public String getBucketName() {
+        return bucketName;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    private static final String SERVER_ABSOLUTE_PATH = "D:/minio/minio/";
+
+    public static String getAbsolutePath(MinIoConstant minIoConstant, String fileName) {
+        return SERVER_ABSOLUTE_PATH + minIoConstant.getBucketName() + "/" + fileName;
+    }
+    public static String getAbsolutePath(String bucketName, String fileName) {
+        return SERVER_ABSOLUTE_PATH + bucketName + "/" + fileName;
+    }
+}
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/minio/utils/MinIoUtil.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/minio/utils/MinIoUtil.java
new file mode 100644
index 0000000..de77544
--- /dev/null
+++ b/ximon-admin/src/main/java/com/sandu/ximon/admin/minio/utils/MinIoUtil.java
@@ -0,0 +1,497 @@
+package com.sandu.ximon.admin.minio.utils;
+
+import com.alibaba.fastjson.JSONObject;
+
+import com.sandu.ximon.admin.config.VnnoxConstant;
+import com.sandu.ximon.admin.minio.config.MinIoPolicy;
+import com.sandu.ximon.admin.minio.entity.MinIoConstant;
+import com.sandu.ximon.admin.utils.LogUtils;
+import com.sandu.ximon.admin.utils.SpringContextUtils;
+import io.minio.*;
+import io.minio.errors.*;
+import io.minio.messages.Bucket;
+import io.minio.messages.DeleteError;
+import io.minio.messages.Item;
+import jdk.nashorn.internal.runtime.regexp.joni.exception.InternalException;
+import lombok.SneakyThrows;
+import org.apache.tomcat.util.http.fileupload.IOUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URLEncoder;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+
+/**
+ * 璋冪敤鏈伐鍏风被璇蜂繚璇乥ucketName涓嶄负绌猴紝涓嶅彲鍦ㄦ牴鐩綍娣诲姞鏂囦欢
+ */
+@Component("MinIoUtil")
+public class MinIoUtil {
+
+    @Autowired
+    private MinioClient minioClient;
+
+    //  URL杩囨湡鏃堕棿
+    private static final Integer DEFAULT_EXPIRY_TIME = 60 * 60 * 24;
+
+
+    public static MinIoUtil getMinIOUtil() {
+        return (MinIoUtil) SpringContextUtils.getBean("MinIoUtil");
+    }
+
+
+    /**
+     * 鑾峰彇瀛樺偍妗剁瓥鐣�
+     *
+     * @param bucketName 瀛樺偍妗跺悕绉�
+     * @return json
+     */
+    private JSONObject getBucketPolicy(String bucketName)
+            throws IOException, InvalidKeyException, InvalidResponseException, BucketPolicyTooLargeException, NoSuchAlgorithmException, ServerException, InternalException, XmlParserException, InvalidBucketNameException, InsufficientDataException, ErrorResponseException, io.minio.errors.InternalException {
+        String bucketPolicy = minioClient
+                .getBucketPolicy(GetBucketPolicyArgs.builder().bucket(bucketName).build());
+        return JSONObject.parseObject(bucketPolicy);
+    }
+
+    /**
+     * 璁剧疆寮�鏀�*鐨勬《绛栫暐
+     *
+     * @param bucketName
+     * @return
+     */
+    public void setBucketPolicy(String bucketName) throws Exception {
+        minioClient.setBucketPolicy(
+                SetBucketPolicyArgs.builder().bucket(bucketName).config(MinIoPolicy.generateMinioPolicy(bucketName)).build()
+        );
+    }
+
+
+    /**
+     * 鍒ゆ柇 bucket鏄惁瀛樺湪
+     *
+     * @param bucketName: 妗跺悕
+     * @return: boolean
+     */
+    @SneakyThrows(Exception.class)
+    public boolean bucketExists(String bucketName) {
+        return minioClient.bucketExists(bucketName);
+    }
+
+    public boolean objectExists(String bucketName, String objectName) {
+        try {
+            getObjectInfo(bucketName, objectName);
+        } catch (Exception e) {
+            return false;
+        }
+        return true;
+    }
+
+    /**
+     * 鍒涘缓 bucket
+     *
+     * @param bucketName: 妗跺悕
+     * @return: void
+     */
+    @SneakyThrows(Exception.class)
+    public void createBucket(String bucketName) {
+        boolean isExist = minioClient.bucketExists((BucketExistsArgs) ((io.minio.BucketExistsArgs.Builder) BucketExistsArgs.builder().bucket(bucketName)).build());
+        if (!isExist) {
+            minioClient.makeBucket((MakeBucketArgs) ((io.minio.MakeBucketArgs.Builder) MakeBucketArgs.builder().bucket(bucketName)).build());
+        }
+    }
+
+    /**
+     * 鑾峰彇鍏ㄩ儴bucket
+     */
+    @SneakyThrows(Exception.class)
+    public List<Bucket> getAllBuckets() {
+        return minioClient.listBuckets();
+    }
+
+    /**
+     * 鍒楀嚭瀛樺偍妗朵腑鐨勬墍鏈夊璞″悕绉�
+     *
+     * @param bucketName 瀛樺偍妗跺悕绉�
+     * @return
+     */
+    @SneakyThrows
+    public List<String> listObjectNames(String bucketName) {
+        List<String> listObjectNames = new ArrayList<>();
+        boolean flag = bucketExists(bucketName);
+        if (flag) {
+            Iterable<Result<Item>> myObjects = listObjects(bucketName);
+            for (Result<Item> result : myObjects) {
+                Item item = result.get();
+                listObjectNames.add(item.objectName());
+            }
+        }
+        return listObjectNames;
+    }
+
+    /**
+     * 鍒楀嚭瀛樺偍妗朵腑鐨勬墍鏈夊璞�
+     *
+     * @param bucketName 瀛樺偍妗跺悕绉�
+     * @return
+     */
+    @SneakyThrows
+    public Iterable<Result<Item>> listObjects(String bucketName) {
+        boolean flag = bucketExists(bucketName);
+        if (flag) {
+            return minioClient.listObjects(bucketName);
+        }
+        return null;
+    }
+
+
+    /**
+     * 鏂囦欢涓婁紶
+     *
+     * @param bucketName: 妗跺悕
+     * @param fileName:   鏂囦欢鍚�
+     * @param filePath:   鏂囦欢璺緞
+     * @return: void
+     */
+    @SneakyThrows(Exception.class)
+    public void uploadToMinIo(String bucketName, String fileName, String filePath) {
+        if (!bucketExists(bucketName)) {
+            createBucket(bucketName);
+
+            LogUtils.print("鍒涘缓妗讹細" + bucketName);
+
+        }
+//        log.log(new LogRecordEntity(
+//                "鏈嶅姟鍣ㄦ枃浠朵笂浼狅細(bucket)"+bucketName +", (fileName)"+fileName+",(filePath)"+filePath,
+//                LogType.MINIO_SERVER,
+//                getNUserId(),
+//                this.getClass()
+//        ));
+        try {
+            //  鍒ゆ柇鏂囦欢鏄惁瀛樺湪
+            if (!objectExists(bucketName, fileName)) {
+                minioClient.putObject(bucketName, fileName, filePath, null);
+            } else {
+//                log.log(new LogRecordEntity(
+//                        "鏈嶅姟鍣ㄦ枃浠跺凡瀛樺湪,璇峰嬁閲嶅涓婁紶锛�(bucket)"+bucketName +", (fileName)"+fileName,
+//                        LogType.MINIO_SERVER,
+//                        getNUserId(),
+//                        this.getClass()
+//                ));
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 鏂囦欢涓婁紶
+     *
+     * @param bucketName: 妗跺悕
+     * @param fileName:   鏂囦欢鍚�
+     * @param stream:     鏂囦欢娴�
+     * @return: 鏂囦欢url鍦板潃
+     */
+    public String upload(String bucketName, String fileName, InputStream stream) {
+        if (!bucketExists(bucketName)) {
+            createBucket(bucketName);
+
+            LogUtils.print("鍒涘缓妗讹細" + bucketName);
+
+        }
+
+        try {
+            //  鍒ゆ柇鏂囦欢鏄惁瀛樺湪
+            if (!objectExists(bucketName, fileName)) {
+                minioClient.putObject(bucketName, fileName, stream, new PutObjectOptions(stream.available(), -1));
+            } else {
+
+                return null;
+            }
+        } catch (Exception e) {
+            return null;
+        }
+        return getFileUrl(bucketName, fileName);
+    }
+
+    /**
+     * 鍒楀嚭鎵�鏈夊瓨鍌ㄦ《鍚嶇О
+     *
+     * @return
+     */
+    @SneakyThrows
+    public List<String> listBucketNames() {
+        List<Bucket> bucketList = getAllBuckets();
+        List<String> bucketListName = new ArrayList<>();
+        for (Bucket bucket : bucketList) {
+            bucketListName.add(bucket.name());
+        }
+        return bucketListName;
+    }
+
+
+    /**
+     * 鏂囦欢涓婁紶
+     *
+     * @param bucketName: 妗跺悕
+     * @param file:       鏂囦欢
+     * @return: 鏂囦欢url鍦板潃
+     */
+    @SneakyThrows(Exception.class)
+    public String upload(String bucketName, MultipartFile file) {
+
+        if (!bucketExists(bucketName)) {
+            createBucket(bucketName);
+            LogUtils.print("鍒涘缓妗讹細" + bucketName);
+            if (bucketName.indexOf(VnnoxConstant.MINIO_PREFIX) != -1) {
+                setBucketPolicy(bucketName);
+            }
+        }
+
+        final InputStream is = file.getInputStream();
+        final String fileName = file.getOriginalFilename();
+        Long start = System.currentTimeMillis();
+        minioClient.putObject(bucketName, fileName, is, new PutObjectOptions(is.available(), -1));
+        is.close();
+        LogUtils.error("涓婁紶鎬绘椂闂达細" + (System.currentTimeMillis() - start) + "ms");
+        return getFileUrl(bucketName, fileName);
+    }
+
+    /**
+     * 鍒犻櫎鏂囦欢
+     *
+     * @param bucketName: 妗跺悕
+     * @param fileName:   鏂囦欢鍚�
+     * @return: void
+     * @date : 2020/8/16 20:53
+     */
+    @SneakyThrows(Exception.class)
+    public boolean deleteFile(String bucketName, String fileName) {
+        //  鍒ゆ柇鏂囦欢鏄惁瀛樺湪
+        if (objectExists(bucketName, fileName)) {
+//            log.log(new LogRecordEntity(
+//                    "鏈嶅姟鍣ㄦ枃浠跺垹闄わ細(bucket)"+bucketName +", (fileName)"+fileName,
+//                    LogType.MINIO_SERVER,
+//                    getNUserId(),
+//                    this.getClass()
+//            ));
+            minioClient.removeObject(bucketName, fileName);
+            if (!objectExists(bucketName, fileName)) {
+                return true;
+            } else {
+                return false;
+            }
+        } else {
+//            log.log(new LogRecordEntity(
+//                    "鏈嶅姟鍣ㄦ枃浠朵笉瀛樺湪,鏃犳硶鍒犻櫎锛�(bucket)"+bucketName +", (fileName)"+fileName,
+//                    LogType.MINIO_SERVER,
+//                    getNUserId(),
+//                    this.getClass()
+//            ));
+            return false;
+        }
+
+    }
+
+    /**
+     * 鍒犻櫎鎸囧畾妗剁殑澶氫釜鏂囦欢瀵硅薄,杩斿洖鍒犻櫎閿欒鐨勫璞″垪琛紝鍏ㄩ儴鍒犻櫎鎴愬姛锛岃繑鍥炵┖鍒楄〃
+     *
+     * @param bucketName  瀛樺偍妗跺悕绉�
+     * @param objectNames 鍚湁瑕佸垹闄ょ殑澶氫釜object鍚嶇О鐨勮凯浠e櫒瀵硅薄
+     * @return
+     */
+    @SneakyThrows
+    public List<String> removeObject(String bucketName, List<String> objectNames) {
+        List<String> deleteErrorNames = new ArrayList<>();
+        boolean flag = bucketExists(bucketName);
+        if (flag) {
+            Iterable<Result<DeleteError>> results = minioClient.removeObjects(bucketName, objectNames);
+            for (Result<DeleteError> result : results) {
+                DeleteError error = result.get();
+                deleteErrorNames.add(error.objectName());
+            }
+        }
+//        log.log(new LogRecordEntity(
+//                "鏈嶅姟鍣ㄦ枃浠舵壒閲忓垹闄わ細(bucket)"+bucketName +", (fileName)"+ JSON.toJSONString(objectNames)+", 鍒犻櫎澶辫触鏂囦欢锛�"+JSON.toJSONString(deleteErrorNames),
+//                LogType.MINIO_SERVER,
+//                getNUserId(),
+//                this.getClass()
+//        ));
+        return deleteErrorNames;
+    }
+
+
+    /**
+     * 涓嬭浇鏂囦欢
+     *
+     * @param bucketName: 妗跺悕
+     * @param fileName:   鏂囦欢鍚�
+     * @param response:
+     * @return: void
+     * @date : 2020/8/17 0:34
+     */
+    @SneakyThrows(Exception.class)
+    public HttpServletResponse download(String bucketName, String fileName, HttpServletResponse response) {
+        // 鑾峰彇瀵硅薄鐨勫厓鏁版嵁
+        final ObjectStat stat = minioClient.statObject(bucketName, fileName);
+        response.setContentType(stat.contentType());
+        response.setCharacterEncoding("UTF-8");
+        response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
+        InputStream is = minioClient.getObject(bucketName, fileName);
+        IOUtils.copy(is, response.getOutputStream());
+        is.close();
+        return response;
+    }
+
+    /**
+     * 鑾峰彇MinIo鏂囦欢鐨勬案涔呬笅杞藉湴鍧�
+     *
+     * @param bucketName: 妗跺悕
+     * @param fileName:   鏂囦欢鍚�
+     * @return:
+     */
+    @SneakyThrows(Exception.class)
+    public String getFileUrl(String bucketName, String fileName) {
+//        log.log(new LogRecordEntity(
+//                "鏈嶅姟鍣ㄦ枃浠惰幏鍙栨案涔呬笅杞藉湴鍧�锛�(bucketName)"+bucketName+", (fileName)"+fileName,
+//                LogType.MINIO_SERVER,
+//                getNUserId(),
+//                this.getClass()
+//        ));
+        return minioClient.presignedGetObject(bucketName, fileName);
+    }
+
+
+    /**
+     * 鐢熸垚涓�涓粰HTTP GET璇锋眰鐢ㄧ殑presigned URL銆�
+     * 娴忚鍣�/绉诲姩绔殑瀹㈡埛绔彲浠ョ敤杩欎釜URL杩涜涓嬭浇锛屽嵆浣垮叾鎵�鍦ㄧ殑瀛樺偍妗舵槸绉佹湁鐨勩�傝繖涓猵resigned URL鍙互璁剧疆涓�涓け鏁堟椂闂达紝榛樿鍊兼槸7澶┿��
+     *
+     * @param bucketName 瀛樺偍妗跺悕绉�
+     * @param objectName 瀛樺偍妗堕噷鐨勫璞″悕绉�
+     * @param expires    澶辨晥鏃堕棿锛堜互绉掍负鍗曚綅
+     * @return
+     */
+    @SneakyThrows
+    public String presignedGetObject(String bucketName, String objectName, Integer expires) {
+        boolean flag = bucketExists(bucketName);
+        String url = "";
+        if (flag) {
+            if (expires < 1 || expires > DEFAULT_EXPIRY_TIME) {
+                throw new InvalidExpiresRangeException(expires,
+                        "expires must be in range of 1 to " + DEFAULT_EXPIRY_TIME);
+            }
+            url = minioClient.presignedGetObject(bucketName, objectName, expires);
+        }
+//        log.log(new LogRecordEntity(
+//                "鏈嶅姟鍣ㄦ枃浠惰幏鍙栨枃浠跺畾鏃朵笅杞藉湴鍧�(get:"+expires+"s)锛�(bucketName)"+bucketName+", (fileName)"+objectName,
+//                LogType.MINIO_SERVER,
+//                getNUserId(),
+//                this.getClass()
+//        ));
+        return url;
+    }
+
+    /**
+     * 鐢熸垚涓�涓粰HTTP PUT璇锋眰鐢ㄧ殑presigned URL銆�
+     * 娴忚鍣�/绉诲姩绔殑瀹㈡埛绔彲浠ョ敤杩欎釜URL杩涜涓婁紶锛屽嵆浣垮叾鎵�鍦ㄧ殑瀛樺偍妗舵槸绉佹湁鐨勩�傝繖涓猵resigned URL鍙互璁剧疆涓�涓け鏁堟椂闂达紝榛樿鍊兼槸7澶┿��
+     *
+     * @param bucketName 瀛樺偍妗跺悕绉�
+     * @param objectName 瀛樺偍妗堕噷鐨勫璞″悕绉�
+     * @param expires    澶辨晥鏃堕棿锛堜互绉掍负鍗曚綅
+     * @return
+     */
+    @SneakyThrows
+    public String presignedPutObject(String bucketName, String objectName, Integer expires) {
+        boolean flag = bucketExists(bucketName);
+        String url = "";
+        if (flag) {
+            if (expires < 10 || expires > DEFAULT_EXPIRY_TIME) {
+                throw new InvalidExpiresRangeException(expires,
+                        "expires must be in range of 1 to " + DEFAULT_EXPIRY_TIME);
+            }
+            url = minioClient.presignedPutObject(bucketName, objectName, expires);
+        }
+//        log.log(new LogRecordEntity(
+//                "鏈嶅姟鍣ㄦ枃浠惰幏鍙栨枃浠跺畾鏃朵笅杞藉湴鍧�(put:"+expires+"s)锛�(bucketName)"+bucketName+", (fileName)"+objectName,
+//                LogType.MINIO_SERVER,
+//                getNUserId(),
+//                this.getClass()
+//        ));
+        return url;
+    }
+
+    /**
+     * 鏍规嵁鏂囦欢鍓嶇疆鏌ヨ鏂囦欢
+     *
+     * @param bucketName bucket鍚嶇О
+     * @param prefix     鍓嶇紑
+     * @param recursive  鏄惁閫掑綊鏌ヨ
+     * @return MinioItem 鍒楄〃
+     */
+    @SneakyThrows
+    public List getAllObjectsByPrefix(String bucketName, String prefix, boolean recursive) {
+        List<Item> list = new ArrayList<>();
+        Iterable<Result<Item>> objectsIterator = minioClient.listObjects(bucketName, prefix, recursive);
+        if (objectsIterator != null) {
+            Iterator<Result<Item>> iterator = objectsIterator.iterator();
+            if (iterator != null) {
+                while (iterator.hasNext()) {
+                    Result<Item> result = iterator.next();
+                    Item item = result.get();
+                    list.add(item);
+                }
+            }
+        }
+
+        return list;
+    }
+
+    /**
+     * 鑾峰彇鏂囦欢
+     *
+     * @param bucketName bucket鍚嶇О
+     * @param objectName 鏂囦欢鍚嶇О
+     * @return 浜岃繘鍒舵祦
+     */
+    @SneakyThrows
+    public InputStream getObject(String bucketName, String objectName) {
+        return minioClient.getObject(bucketName, objectName);
+    }
+
+
+    /**
+     * 鑾峰彇鏂囦欢淇℃伅, 濡傛灉鎶涘嚭寮傚父鍒欒鏄庢枃浠朵笉瀛樺湪
+     *
+     * @param bucketName bucket鍚嶇О
+     * @param objectName 鏂囦欢鍚嶇О
+     * @throws Exception https://docs.minio.io/cn/java-client-api-reference.html#statObject
+     */
+    public ObjectStat getObjectInfo(String bucketName, String objectName) throws Exception {
+        ObjectStat objectStat = minioClient.statObject(bucketName, objectName);
+        return objectStat;
+    }
+
+    /**
+     * 鑾峰彇鏂囦欢缁濆璺緞
+     *
+     * @param bucketName
+     * @param objectName
+     * @return
+     */
+    public String getAbsolutePath(String bucketName, String objectName) {
+        try {
+            getObjectInfo(bucketName, objectName);
+        } catch (Exception e) {
+            return null;
+        }
+        return MinIoConstant.getAbsolutePath(bucketName, objectName);
+    }
+
+}
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/service/IpVolumeFileService.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/service/IpVolumeFileService.java
index e2a44a3..1e87569 100644
--- a/ximon-admin/src/main/java/com/sandu/ximon/admin/service/IpVolumeFileService.java
+++ b/ximon-admin/src/main/java/com/sandu/ximon/admin/service/IpVolumeFileService.java
@@ -4,25 +4,33 @@
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.github.pagehelper.PageHelper;
 import com.sandu.common.execption.BusinessException;
+import com.sandu.common.file.FileUploadDto;
 import com.sandu.common.object.BaseConditionVO;
 import com.sandu.common.service.impl.BaseServiceImpl;
+import com.sandu.ximon.admin.minio.BroadcastFileUtils;
+import com.sandu.ximon.admin.minio.entity.FileSuffix;
+import com.sandu.ximon.admin.minio.entity.MinIoConstant;
+import com.sandu.ximon.admin.minio.utils.MinIoUtil;
 import com.sandu.ximon.admin.param.IpVolumeFileParam;
 import com.sandu.ximon.admin.security.SecurityUtils;
 import com.sandu.ximon.dao.domain.IpVolumeFile;
 import com.sandu.ximon.dao.mapper.IpVolumeFileMapper;
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
 
 /**
  * @Author liuhaonan
  * @Date 2021/12/16 10:48
  * @Version 1.0
  */
+
 @Service
 @AllArgsConstructor
 public class IpVolumeFileService extends BaseServiceImpl<IpVolumeFileMapper, IpVolumeFile> {
     private final IpVolumeFileMapper ipVolumeFileMapper;
     private final ClientService clientService;
+    private MinIoUtil minIoUtil;
 
 
     public boolean addFile(IpVolumeFileParam fileParam) {
@@ -31,14 +39,12 @@
 //            file.setUserName(SecurityUtils.getUsername());
 //        }
 //
-        if(SecurityUtils.getClientId()!=null){
+        if (SecurityUtils.getClientId() != null) {
             file.setUserName(SecurityUtils.getUsername());
             file.setUserId(SecurityUtils.getClientId());
-        }
-
-        if(clientService.getClientId()!=null){
             file.setClientId(clientService.getClientId());
         }
+
         file.setFileName(fileParam.getFileName());
         file.setFileUrl(fileParam.getFileUrl());
         file.setOriginSize(fileParam.getOriginSize());
@@ -59,28 +65,50 @@
         if (keyword.isEmpty()) {
             return wrapper;
         } else {
-          return   wrapper.like(IpVolumeFile::getFileName,keyword);
+            return wrapper.like(IpVolumeFile::getFileName, keyword);
         }
     }
 
-    public boolean upload(IpVolumeFileParam fileParam) {
-        IpVolumeFile file = new IpVolumeFile();
-//        if(SecurityUtils.getClientId()!=null){
-//            file.setUserName(SecurityUtils.getUsername());
-//        }
-//
-        if(SecurityUtils.getClientId()!=null){
-            file.setUserName(SecurityUtils.getUsername());
-            file.setUserId(SecurityUtils.getClientId());
+
+    /**
+     * 鏂囦欢涓婁紶
+     *
+     * @param file
+     * @param userId
+     * @return
+     */
+    public FileUploadDto upload(MultipartFile file) {
+        log.error("闊虫煴鏂囦欢涓婁紶锛�(filename:" + file.getOriginalFilename() + "),(size: " + file.getSize() + "),鐢ㄦ埛id:" + SecurityUtils.getUserId());
+        //  鏍¢獙鏄惁涓簃p3鏂囦欢
+        if (!BroadcastFileUtils.isMp3File(file.getOriginalFilename(), FileSuffix.MP3)) {
+            log.error("闊虫煴鏂囦欢涓婁紶锛�(涓婁紶澶辫触, 闈濵P3鏂囦欢) (filename:" + file.getOriginalFilename() + "),(size: " + file.getSize() + "),鐢ㄦ埛id:" + SecurityUtils.getUserId());
+            throw new BusinessException("涓婁紶澶辫触, 闈濵P3鏂囦欢");
+        }
+        //  鍒ゆ柇璇ユ枃浠舵槸鍚﹀瓨鍦�
+        String bucketName;
+        if (SecurityUtils.getClientId() == null) {
+            bucketName = MinIoConstant.ADMIN_BROADCAST_FILE.getBucketName();
+        } else {
+            bucketName = MinIoConstant.BROADCAST_FILE.getBucketName() + SecurityUtils.getUserId();
+        }
+        if (minIoUtil.objectExists(bucketName, file.getOriginalFilename())) {
+            log.error("闊虫煴鏂囦欢涓婁紶锛�(涓婁紶澶辫触, 鍚屽悕鏂囦欢宸插瓨鍦�) (filename:" + file.getOriginalFilename() + "),(size: " + file.getSize() + "),鐢ㄦ埛id:" + SecurityUtils.getUserId());
+            throw new BusinessException("涓婁紶澶辫触, 鍚屽悕鏂囦欢宸插瓨鍦�");
         }
 
-        if(clientService.getClientId()!=null){
-            file.setClientId(clientService.getClientId());
+
+        String upload = minIoUtil.upload(bucketName, file);
+
+        if (null == upload) {
+            log.error("闊虫煴鏂囦欢涓婁紶锛�(涓婁紶澶辫触, 鏂囦欢鏈嶅姟鍣ㄥ嚭閿�) (filename:" + file.getOriginalFilename() + "),(size: " + file.getSize() + "),鐢ㄦ埛id:" + SecurityUtils.getUserId());
+            throw new BusinessException("涓婁紶澶辫触, 鏂囦欢鏈嶅姟鍣ㄥ嚭閿�");
         }
-        file.setFileName(fileParam.getFileName());
-        file.setFileUrl(fileParam.getFileUrl());
-        file.setOriginSize(fileParam.getOriginSize());
-        return save(file);
+        FileUploadDto fileUploadDto = new FileUploadDto();
+        fileUploadDto.setFileUrl(upload);
+        fileUploadDto.setFileSize(file.getSize());
+        fileUploadDto.setFileName(file.getOriginalFilename());
+        fileUploadDto.setFileType(file.getContentType());
+        return fileUploadDto;
     }
 
 }
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/service/IpVolumeMissionService.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/service/IpVolumeMissionService.java
index 76a8f83..492ad03 100644
--- a/ximon-admin/src/main/java/com/sandu/ximon/admin/service/IpVolumeMissionService.java
+++ b/ximon-admin/src/main/java/com/sandu/ximon/admin/service/IpVolumeMissionService.java
@@ -7,6 +7,7 @@
 import com.sandu.common.execption.BusinessException;
 import com.sandu.common.object.BaseConditionVO;
 import com.sandu.common.service.impl.BaseServiceImpl;
+import com.sandu.ximon.admin.minio.entity.MinIoConstant;
 import com.sandu.ximon.admin.param.IpVolumeMissionParam;
 import com.sandu.ximon.admin.security.SecurityUtils;
 import com.sandu.ximon.admin.utils.TaskAPIUtils;
@@ -95,15 +96,24 @@
             if (fileEntity == null) {
                 throw new BusinessException("fileId涓�" + fileId + "鐨勬枃浠朵笉瀛樺湪");
             }
-//            String absolutePath = MinIoConstant.getAbsolutePath(
-//                    MinIoConstant.BROADCAST_FILE.getBucketName() + fileEntity.getUserId(),
-//                    fileEntity.getFileName()
-//            );
-
+            if(fileEntity.getUserId()==null&&fileEntity.getClientId()!=null){
+                fileEntity.setUserId(fileEntity.getClientId());
+            }
+            String absolutePath;
+            absolutePath = MinIoConstant.getAbsolutePath(
+                    MinIoConstant.BROADCAST_FILE.getBucketName() + fileEntity.getUserId(),
+                    fileEntity.getFileName()
+            );
+            if(fileEntity.getUserId()==null&&fileEntity.getClientId()==null){
+                absolutePath = MinIoConstant.getAbsolutePath(
+                        MinIoConstant.ADMIN_BROADCAST_FILE.getBucketName(),
+                        fileEntity.getFileName()
+                );
+            }
             taskMediaFileVO.setI(i);
             i++;
             taskMediaFileVO.setT(0);
-            taskMediaFileVO.setN(fileEntity.getFileUrl());
+            taskMediaFileVO.setN(absolutePath);
             taskMediaFileVO.setS(BigInteger.valueOf(fileEntity.getOriginSize()));
 
             taskMediaFileVOS.add(taskMediaFileVO);
@@ -214,15 +224,15 @@
             taskFileEntity.setFileId(fileId);
 
             IpVolumeFile fileEntity = ipVolumeFileService.getById(fileId);
-//            String absolutePath = MinIoConstant.getAbsolutePath(
-//                    MinIoConstant.BROADCAST_FILE.getBucketName() + fileEntity.getUserId(),
-//                    fileEntity.getFileName()
-//            );
+            String absolutePath = MinIoConstant.getAbsolutePath(
+                    MinIoConstant.BROADCAST_FILE.getBucketName() + fileEntity.getUserId(),
+                    fileEntity.getFileName()
+            );
 
             taskMediaFileVO.setI(i);
             i++;
             taskMediaFileVO.setT(0);
-            taskMediaFileVO.setN(fileEntity.getFileUrl());
+            taskMediaFileVO.setN(absolutePath);
             taskMediaFileVO.setS(BigInteger.valueOf(fileEntity.getOriginSize()));
 
             taskMediaFileVOS.add(taskMediaFileVO);
diff --git a/ximon-admin/src/main/resources/application-dev.yml b/ximon-admin/src/main/resources/application-dev.yml
index ae1ed17..bec0b98 100644
--- a/ximon-admin/src/main/resources/application-dev.yml
+++ b/ximon-admin/src/main/resources/application-dev.yml
@@ -39,4 +39,10 @@
 listenter:
   isOpen: false
 
+minio:
+  endpoint: 47.106.172.9
+  port: 9000
+  accessKey: minioadmin
+  secretKey: zhxm2512209
+  secure: false
 
diff --git a/ximon-admin/src/main/resources/application-test.yml b/ximon-admin/src/main/resources/application-test.yml
index 38eff74..025730f 100644
--- a/ximon-admin/src/main/resources/application-test.yml
+++ b/ximon-admin/src/main/resources/application-test.yml
@@ -32,7 +32,7 @@
     upload-root-path: /usr/local/project/ximon-light-20017/file/
     storage: local
   common:
-    urlPrefix: http://112.74.63.130/file/
+    urlPrefix: http://112.74.63.130:20017/file/
   quartz:
     enable: true
 
@@ -40,4 +40,10 @@
   isOpen: false
 
 
+minio:
+  endpoint: 47.106.172.9
+  port: 9000
+  accessKey: minioadmin
+  secretKey: zhxm2512209
+  secure: false
 
diff --git a/ximon-admin/src/main/resources/application.yml b/ximon-admin/src/main/resources/application.yml
index d1e6dc2..46fd8c2 100644
--- a/ximon-admin/src/main/resources/application.yml
+++ b/ximon-admin/src/main/resources/application.yml
@@ -51,4 +51,10 @@
   ip: 47.106.172.9 # 47.106.172.9/101.132.131.91
 
 
+minio:
+  endpoint: 47.106.172.9
+  port: 9000
+  accessKey: minioadmin
+  secretKey: zhxm2512209
+  secure: false
 

--
Gitblit v1.9.3