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> 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)); } } 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 )); } } 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; } } 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); } } 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; } 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; } 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; } } 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; } } 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; /** * è°ç¨æ¬å·¥å ·ç±»è¯·ä¿è¯bucketNameä¸ä¸ºç©ºï¼ä¸å¯å¨æ ¹ç®å½æ·»å æä»¶ */ @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åç§°çè¿ä»£å¨å¯¹è±¡ * @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è¿è¡ä¸è½½ï¼å³ä½¿å ¶æå¨çå卿¡¶æ¯ç§æçãè¿ä¸ªpresigned 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è¿è¡ä¸ä¼ ï¼å³ä½¿å ¶æå¨çå卿¡¶æ¯ç§æçãè¿ä¸ªpresigned 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); } } 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()); // æ ¡éªæ¯å¦ä¸ºmp3æä»¶ if (!BroadcastFileUtils.isMp3File(file.getOriginalFilename(), FileSuffix.MP3)) { log.error("鳿±æä»¶ä¸ä¼ ï¼(ä¸ä¼ 失败, éMP3æä»¶) (filename:" + file.getOriginalFilename() + "),(size: " + file.getSize() + "),ç¨æ·id:" + SecurityUtils.getUserId()); throw new BusinessException("ä¸ä¼ 失败, éMP3æä»¶"); } // å¤æè¯¥æä»¶æ¯å¦åå¨ 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; } } 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); 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 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 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