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