From 3dadd51018b621bbb5b3abcde94df6d8fa9fbf6b Mon Sep 17 00:00:00 2001 From: ‘liusuyi’ <1951119284@qq.com> Date: 星期三, 23 八月 2023 14:36:34 +0800 Subject: [PATCH] 重构minio工具类 配置文件区分生产环境和开发环境 --- src/main/java/com/ard/utils/minio/MinioUtils.java | 592 ++++++++++++++++++++ src/main/java/com/ard/utils/spring/SpringUtils.java | 158 +++++ src/main/java/com/ard/alarm/apponekey/controller/ArdAlarmApponekeyController.java | 12 src/main/java/com/ard/utils/mqtt/MqttConsumerCallback.java | 4 src/main/resources/application-prod.yml | 67 ++ src/main/java/com/ard/utils/hiksdk/service/impl/HikClientUtil.java | 11 /dev/null | 56 - src/main/java/com/ard/utils/minio/MinioConfig.java | 33 + src/main/java/com/ard/utils/udp/NettyUdpHandler.java | 4 src/main/java/com/ard/utils/hiksdk/service/impl/FMSGCallBack.java | 18 src/main/resources/application-dev.yml | 70 ++ src/main/java/com/ard/utils/mqtt/MqttConsumer.java | 31 src/main/java/com/ard/utils/other/StringUtils.java | 577 +++++++++++++++++++ src/main/resources/application.yml | 63 -- 14 files changed, 1,548 insertions(+), 148 deletions(-) diff --git a/src/main/java/com/ard/alarm/apponekey/controller/ArdAlarmApponekeyController.java b/src/main/java/com/ard/alarm/apponekey/controller/ArdAlarmApponekeyController.java index eb9295d..c9428ee 100644 --- a/src/main/java/com/ard/alarm/apponekey/controller/ArdAlarmApponekeyController.java +++ b/src/main/java/com/ard/alarm/apponekey/controller/ArdAlarmApponekeyController.java @@ -1,12 +1,12 @@ package com.ard.alarm.apponekey.controller; -import com.ard.utils.hiksdk.util.minio.MinioUtils; import com.ard.utils.http.AjaxResult; -import org.springframework.beans.factory.annotation.Autowired; +import com.ard.utils.minio.MinioUtils; import org.springframework.web.bind.annotation.*; import com.ard.alarm.apponekey.domain.ArdAlarmApponekey; import com.ard.alarm.apponekey.service.IArdAlarmApponekeyService; import org.springframework.web.multipart.MultipartFile; +import javax.annotation.Resource; /** @@ -18,16 +18,16 @@ @RestController @RequestMapping("/alarm/apponekey") public class ArdAlarmApponekeyController { - @Autowired + @Resource private IArdAlarmApponekeyService ardAlarmApponekeyService; - - + @Resource + private MinioUtils minioUtil; /** * 鏂板app涓�閿姤璀� */ @PostMapping public AjaxResult add(String userId,String name, Double longitude,Double latitude,Double altitude,MultipartFile file) { - String url = MinioUtils.putObjectAndGetUrl("record", file); + String url = minioUtil.putObjectAndGetUrl("record", file); ArdAlarmApponekey ardAlarmApponekey =new ArdAlarmApponekey(); ardAlarmApponekey.setUserId(userId); ardAlarmApponekey.setName(name); diff --git a/src/main/java/com/ard/config/MinioClientSingleton.java b/src/main/java/com/ard/config/MinioClientSingleton.java deleted file mode 100644 index 3cdbd35..0000000 --- a/src/main/java/com/ard/config/MinioClientSingleton.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.ard.config; - -import com.ard.utils.other.SpringTool; -import io.minio.MinioClient; -import lombok.extern.slf4j.Slf4j; -import org.springframework.context.annotation.Bean; -import org.springframework.integration.channel.DefaultHeaderChannelRegistry; -import org.springframework.integration.channel.PublishSubscribeChannel; -import org.springframework.stereotype.Component; - -/** - * @Description: - * @ClassName: MinioClientSingleton - * @Author: 鍒樿嫃涔� - * @Date: 2023骞�05鏈�18鏃�9:32 - * @Version: 1.0 - **/ - -@Slf4j(topic = "minio") -@Component -public class MinioClientSingleton { - - public static String domainUrl; - private static String accessKey; - private static String secretKey; - - private volatile static MinioClient minioClient; - - static { - domainUrl = SpringTool.getYmlInfo("minio.endpoint"); - accessKey = SpringTool.getYmlInfo("minio.accessKey"); - secretKey = SpringTool.getYmlInfo("minio.secretKey"); - log.debug("minio淇℃伅锛�" + domainUrl + "(" + accessKey + "/" + secretKey + ")"); - } - - /** - * 鑾峰彇minio瀹㈡埛绔疄渚� - * - * @return {@link MinioClient} - */ - public static MinioClient getMinioClient() { - if (minioClient == null) { - synchronized (MinioClientSingleton.class) { - if (minioClient == null) { - minioClient = MinioClient.builder() - .endpoint(domainUrl) - .credentials(accessKey, secretKey) - .build(); - } - } - } - return minioClient; - } - - - @Bean - public PublishSubscribeChannel errorChannel() { - return new PublishSubscribeChannel(); - } - @Bean - public DefaultHeaderChannelRegistry integrationHeaderChannelRegistry() { - return new DefaultHeaderChannelRegistry(); - } -} - diff --git a/src/main/java/com/ard/utils/hiksdk/service/impl/FMSGCallBack.java b/src/main/java/com/ard/utils/hiksdk/service/impl/FMSGCallBack.java index 68eda58..d0cae9d 100644 --- a/src/main/java/com/ard/utils/hiksdk/service/impl/FMSGCallBack.java +++ b/src/main/java/com/ard/utils/hiksdk/service/impl/FMSGCallBack.java @@ -6,17 +6,16 @@ import com.ard.alarm.camera.service.IArdCamerasService; import com.ard.alarm.external.domain.ArdEquipExternal; import com.ard.alarm.external.service.IArdEquipExternalService; -import com.ard.config.MinioClientSingleton; +import com.ard.utils.minio.MinioUtils; import com.ard.utils.other.ByteUtils; import com.ard.utils.hiksdk.common.GlobalVariable; import com.ard.utils.hiksdk.domain.AccessControlHostEventInfo; import com.ard.utils.hiksdk.domain.CameraEventInfo; import com.ard.utils.hiksdk.domain.ExternalAlarmEventInfo; import com.ard.utils.hiksdk.util.hikSdkUtil.HCNetSDK; -import com.ard.utils.hiksdk.util.minio.MinioUtils; import com.ard.utils.other.DateUtils; -import com.ard.utils.other.SpringTool; import com.ard.utils.mqtt.MqttConsumer; +import com.ard.utils.spring.SpringUtils; import com.ard.utils.uuid.IdUtils; import com.sun.jna.Pointer; import lombok.extern.slf4j.Slf4j; @@ -61,7 +60,7 @@ ArdCameras ardCameras = new ArdCameras(); ardCameras.setIp(sDeviceIP); ardCameras.setPort(wLinkPort); - IArdCamerasService ardCamerasService = SpringTool.getApplicationContext().getBean(IArdCamerasService.class); + IArdCamerasService ardCamerasService = SpringUtils.getBean(IArdCamerasService.class); ArdCameras camera = ardCamerasService.selectArdCamerasList(ardCameras).get(0); HCNetSDK.NET_DVR_ALARMINFO_V30 netDvrAlarminfoV30 = new HCNetSDK.NET_DVR_ALARMINFO_V30(); netDvrAlarminfoV30.write(); @@ -95,7 +94,7 @@ ardCameras = new ArdCameras(); ardCameras.setIp(sDeviceIP); ardCameras.setPort(wLinkPort); - ardCamerasService = SpringTool.getApplicationContext().getBean(IArdCamerasService.class); + ardCamerasService = SpringUtils.getBean(IArdCamerasService.class); ArdCameras ardCamera = ardCamerasService.selectArdCamerasList(ardCameras).get(0); HCNetSDK.NET_VCA_RULE_ALARM strVcaAlarm = new HCNetSDK.NET_VCA_RULE_ALARM(); @@ -190,7 +189,7 @@ ArdEquipExternal ardEquipExternal = new ArdEquipExternal(); ardEquipExternal.setIp(sDeviceIP); ardEquipExternal.setPort(wLinkPort); - IArdEquipExternalService ardEquipExternalService = SpringTool.getApplicationContext().getBean(IArdEquipExternalService.class); + IArdEquipExternalService ardEquipExternalService = SpringUtils.getBean(IArdEquipExternalService.class); ardEquipExternal = ardEquipExternalService.selectArdEquipExternal(ardEquipExternal); @@ -276,7 +275,7 @@ ArdEquipExternal accessControlHost = new ArdEquipExternal(); accessControlHost.setIp(sDeviceIP); accessControlHost.setPort(wLinkPort); - ardEquipExternalService = SpringTool.getApplicationContext().getBean(IArdEquipExternalService.class); + ardEquipExternalService = SpringUtils.getBean(IArdEquipExternalService.class); accessControlHost = ardEquipExternalService.selectArdEquipExternal(accessControlHost); HCNetSDK.NET_DVR_ACS_ALARM_INFO strACSInfo = new HCNetSDK.NET_DVR_ACS_ALARM_INFO(); @@ -322,9 +321,10 @@ InputStream input = new ByteArrayInputStream(bytes); String bucketName = "pic"; String objectName = "alarm/" + IdUtils.simpleUUID() + ".jpeg"; - boolean uploadObject = MinioUtils.uploadObject(bucketName, objectName, input, "image/JPEG"); + MinioUtils minioUtil = SpringUtils.getBean(MinioUtils.class); + boolean uploadObject = minioUtil.uploadObject(bucketName, objectName, input,input.available(), "image/JPEG"); if (uploadObject) { - url = MinioClientSingleton.domainUrl + "/" + bucketName + "/" + objectName; + url = minioUtil.getBucketObjectUrl(bucketName, objectName); //log.debug("涓婁紶鏂囦欢鎴愬姛!" + url); } } catch (Exception e) { diff --git a/src/main/java/com/ard/utils/hiksdk/service/impl/HikClientUtil.java b/src/main/java/com/ard/utils/hiksdk/service/impl/HikClientUtil.java index 92b0b37..2bb03b3 100644 --- a/src/main/java/com/ard/utils/hiksdk/service/impl/HikClientUtil.java +++ b/src/main/java/com/ard/utils/hiksdk/service/impl/HikClientUtil.java @@ -3,12 +3,12 @@ import com.ard.alarm.camera.domain.ArdCameras; import com.ard.alarm.camera.domain.CameraCmd; import com.ard.alarm.external.domain.ArdEquipExternal; -import com.ard.config.MinioClientSingleton; +import com.ard.utils.minio.MinioUtils; import com.ard.utils.other.ByteUtils; import com.ard.utils.hiksdk.common.GlobalVariable; import com.ard.utils.hiksdk.domain.DeviceInfo; import com.ard.utils.hiksdk.util.hikSdkUtil.HCNetSDK; -import com.ard.utils.hiksdk.util.minio.MinioUtils; +import com.ard.utils.spring.SpringUtils; import com.sun.jna.Native; import com.sun.jna.Platform; import com.sun.jna.Pointer; @@ -434,11 +434,10 @@ InputStream input = new ByteArrayInputStream(array); String url = ""; try { - boolean b = MinioUtils.uploadObject(cmd.getBucketName(), cmd.getObjectName(), input, ContentType); + MinioUtils minioUtil = SpringUtils.getBean(MinioUtils.class); + boolean b = minioUtil.uploadObject(cmd.getBucketName(), cmd.getObjectName(), input,input.available(), ContentType); if (b) { - // url = MinioUtils.getBucketObjectUrl(cmd.getBucketName(), cmd.getObjectName()); - // url = url.indexOf('?') != -1 ? url.substring(0, url.indexOf('?')) : url; - url = MinioClientSingleton.domainUrl + "/" + cmd.getBucketName() + "/" + cmd.getObjectName(); + url = minioUtil.getBucketObjectUrl(cmd.getBucketName(), cmd.getObjectName()); // log.debug("涓婁紶鏂囦欢鎴愬姛!" + url); } } catch (Exception ex) { diff --git a/src/main/java/com/ard/utils/hiksdk/util/minio/MinioUtils.java b/src/main/java/com/ard/utils/hiksdk/util/minio/MinioUtils.java deleted file mode 100644 index 0e600e0..0000000 --- a/src/main/java/com/ard/utils/hiksdk/util/minio/MinioUtils.java +++ /dev/null @@ -1,477 +0,0 @@ -package com.ard.utils.hiksdk.util.minio; - -import com.ard.config.MinioClientSingleton; -import io.minio.*; -import io.minio.http.Method; -import io.minio.messages.Bucket; -import io.minio.messages.DeleteError; -import io.minio.messages.DeleteObject; -import io.minio.messages.Item; -import lombok.extern.slf4j.Slf4j; -import org.springframework.web.multipart.MultipartFile; -import java.io.*; -import java.util.*; -import java.util.concurrent.TimeUnit; - -/** - * @Description: Minio瀹㈡埛绔伐鍏风被 - * @ClassName: MinioUtils - * @Author: 鍒樿嫃涔� - * @Date: 2023骞�05鏈�18鏃�9:34 - * @Version: 1.0 - **/ -@SuppressWarnings("ALL") -@Slf4j(topic = "minio") -public class MinioUtils { - - /** - * 鍒ゆ柇妗舵槸鍚﹀瓨鍦� - */ - public static boolean exitsBucket(String bucketName) { - boolean found = false; - try { - BucketExistsArgs bucketExistsArgs = BucketExistsArgs.builder().bucket(bucketName).build(); - found = MinioClientSingleton.getMinioClient().bucketExists(bucketExistsArgs); - } catch (Exception ex) { - log.error("minio鍒ゆ柇妗跺瓨鍦ㄥ紓甯革細", ex.getMessage()); - } - return found; - } - - /** - * 鍒涘缓妗�,骞惰缃《绛栫暐涓哄叕鍏� - */ - public static boolean createBucket(String bucketName) { - try { - /*鍒涘缓妗�*/ - MakeBucketArgs makeBucketArgs = MakeBucketArgs.builder().bucket(bucketName).build(); - MinioClientSingleton.getMinioClient().makeBucket(makeBucketArgs); - /*璁剧疆绛栫暐*/ - String sb = "{\"Version\":\"2012-10-17\"," + - "\"Statement\":[{\"Effect\":\"Allow\",\"Principal\":" + - "{\"AWS\":[\"*\"]},\"Action\":[\"s3:ListBucket\",\"s3:ListBucketMultipartUploads\"," + - "\"s3:GetBucketLocation\"],\"Resource\":[\"arn:aws:s3:::" + bucketName + - "\"]},{\"Effect\":\"Allow\",\"Principal\":{\"AWS\":[\"*\"]},\"Action\":[\"s3:PutObject\",\"s3:AbortMultipartUpload\",\"s3:DeleteObject\",\"s3:GetObject\",\"s3:ListMultipartUploadParts\"],\"Resource\":[\"arn:aws:s3:::" + - bucketName + "/*\"]}]}"; - SetBucketPolicyArgs setBucketPolicyArgs = SetBucketPolicyArgs.builder() - .bucket(bucketName) - .config(sb) - .build(); - MinioClientSingleton.getMinioClient().setBucketPolicy(setBucketPolicyArgs); - return true; - } catch (Exception ex) { - log.error("minio鍒涘缓妗跺紓甯革細", ex.getMessage()); - return false; - } - } - - /** - * 鍒犻櫎涓�涓《 - * - * @param bucket 妗跺悕绉� - */ - public static boolean removeBucket(String bucket) { - try { - boolean found = exitsBucket(bucket); - if (found) { - Iterable<Result<Item>> myObjects = MinioClientSingleton.getMinioClient().listObjects(ListObjectsArgs.builder().bucket(bucket).build()); - for (Result<Item> result : myObjects) { - Item item = result.get(); - //鏈夊璞℃枃浠讹紝鍒欏垹闄ゅけ璐� - if (item.size() > 0) { - return false; - } - } - // 鍒犻櫎`bucketName`瀛樺偍妗讹紝娉ㄦ剰锛屽彧鏈夊瓨鍌ㄦ《涓虹┖鏃舵墠鑳藉垹闄ゆ垚鍔熴�� - MinioClientSingleton.getMinioClient().removeBucket(RemoveBucketArgs.builder().bucket(bucket).build()); - found = exitsBucket(bucket); - return !found; - } - } catch (Exception ex) { - log.error("鍒犻櫎妗跺紓甯革細" + ex.getMessage()); - } - return false; - } - - /** - * 鏌ヨ鎵�鏈夋《鏂囦欢 - * - * @return - */ - public static List<Bucket> getListBuckets() { - try { - return MinioClientSingleton.getMinioClient().listBuckets(); - } catch (Exception e) { - e.printStackTrace(); - } - return Collections.emptyList(); - } - - /** - * 鐢熸垚涓�涓狦ET璇锋眰鐨勫甫鏈夊け鏁堟椂闂寸殑鍒嗕韩閾炬帴銆� - * 澶辨晥鏃堕棿榛樿鏄�7澶┿�� - * - * @param bucketName 瀛樺偍妗跺悕绉� - * @param objectName 瀛樺偍妗堕噷鐨勫璞″悕绉� - * @param expires 澶辨晥鏃堕棿锛堜互绉掍负鍗曚綅锛夛紝榛樿鏄�7澶╋紝涓嶅緱澶т簬涓冨ぉ - * @return - */ - public static String getObjectWithExpired(String bucketName, String objectName, Integer expires, TimeUnit timeUnit) { - String url = ""; - if (exitsBucket(bucketName)) { - try { - GetPresignedObjectUrlArgs getPresignedObjectUrlArgs = GetPresignedObjectUrlArgs.builder() - .method(Method.GET) - .bucket(bucketName) - .object(objectName) - .expiry(expires, timeUnit) - .build(); - url = MinioClientSingleton.getMinioClient().getPresignedObjectUrl(getPresignedObjectUrlArgs); - } catch (Exception ex) { - log.error("minio鐢熸垚澶辨晥url寮傚父", ex.getMessage()); - } - } - return url; - } - - /** - * @鎻忚堪 涓婁紶MultipartFile鏂囦欢杩斿洖url - * @鍙傛暟 [bucketName, file] - * @杩斿洖鍊� java.lang.String - * @鍒涘缓浜� 鍒樿嫃涔� - * @鍒涘缓鏃堕棿 2023/5/18 12:16 - * @淇敼浜哄拰鍏跺畠淇℃伅 - */ - public static String putObjectAndGetUrl(String bucketName, MultipartFile file) { - //鍒ゆ柇鏂囦欢鏄惁涓虹┖ - if (null == file || 0 == file.getSize()) { - log.error("涓婁紶minio鏂囦欢鏈嶅姟鍣ㄩ敊璇紝涓婁紶鏂囦欢涓虹┖"); - } - boolean exsit = exitsBucket(bucketName); - if (!exsit) { - log.error(bucketName + "-妗朵笉瀛樺湪"); - } - //鏂囦欢鍚� - String originalFilename = file.getOriginalFilename(); - //鏂扮殑鏂囦欢鍚� - String fileName = UUID.randomUUID().toString().replace("-", "") +"_"+ originalFilename; - try { - InputStream inputStream = file.getInputStream(); - /*涓婁紶瀵硅薄*/ - PutObjectArgs putObjectArgs = PutObjectArgs - .builder() - .bucket(bucketName) - .object(fileName) - .stream(inputStream, file.getSize(), -1) - .contentType(file.getContentType()) - .build(); - MinioClientSingleton.getMinioClient().putObject(putObjectArgs); - inputStream.close(); - /*鑾峰彇url*/ - GetPresignedObjectUrlArgs getPresignedObjectUrlArgs = GetPresignedObjectUrlArgs - .builder() - .method(Method.GET) - .bucket(bucketName) - .object(fileName) - .build(); - String presignedObjectUrl = MinioClientSingleton.getMinioClient().getPresignedObjectUrl(getPresignedObjectUrlArgs); - String ObjectUrl = presignedObjectUrl.substring(0, presignedObjectUrl.indexOf("?")); - return ObjectUrl; - } catch (Exception ex) { - log.error("涓婁紶瀵硅薄杩斿洖url寮傚父锛�" + ex.getMessage()); - } - return ""; - } - - /** - * 鍒犻櫎鏂囦欢 - * - * @param bucket 妗跺悕绉� - * @param objectName 瀵硅薄鍚嶇О - * @return boolean - */ - public static boolean removeObject(String bucket, String objectName) { - try { - boolean exsit = exitsBucket(bucket); - if (exsit) { - RemoveObjectArgs removeObjectArgs = RemoveObjectArgs.builder().bucket(bucket).object(objectName).build(); - MinioClientSingleton.getMinioClient().removeObject(removeObjectArgs); - return true; - } - } catch (Exception e) { - log.error("removeObject", e); - } - return false; - } - - /** - * 鎵归噺鍒犻櫎鏂囦欢 - * - * @param objectNames 瀵硅薄鍚嶇О - * @return boolean - */ - public static boolean removeObjects(String bucket, List<String> objectNames) { - if (exitsBucket(bucket)) { - try { - List<DeleteObject> objects = new LinkedList<>(); - for (String str : objectNames) { - objects.add(new DeleteObject(str)); - } - RemoveObjectsArgs removeObjectsArgs = RemoveObjectsArgs.builder().bucket(bucket).objects(objects).build(); - Iterable<Result<DeleteError>> results = MinioClientSingleton.getMinioClient().removeObjects(removeObjectsArgs); - /*鍒犻櫎瀹岄亶鍘嗙粨鏋滐紝鍚﹀垯鍒犱笉鎺�*/ - for (Result<DeleteError> result : results) { - DeleteError error = result.get(); - log.error("Error in deleting object " + error.objectName() + "; " + error.message()); - } - - return true; - } catch (Exception ex) { - log.error("minio鎵归噺鍒犻櫎鏂囦欢寮傚父", ex.getMessage()); - } - } - return false; - } - - /** - * 鑾峰彇鍗曚釜妗朵腑鐨勬墍鏈夋枃浠跺璞″悕绉� - * - * @param bucket 妗跺悕绉� - * @return {@link List}<{@link String}> - */ - public static List<String> getBucketObjectName(String bucket) { - boolean exsit = exitsBucket(bucket); - if (exsit) { - List<String> listObjetcName = new ArrayList<>(); - try { - ListObjectsArgs listObjectsArgs = ListObjectsArgs.builder().bucket(bucket).build(); - Iterable<Result<Item>> myObjects = MinioClientSingleton.getMinioClient().listObjects(listObjectsArgs); - for (Result<Item> result : myObjects) { - Item item = result.get(); - listObjetcName.add(item.objectName()); - } - return listObjetcName; - } catch (Exception ex) { - log.error("minio鑾峰彇妗朵笅瀵硅薄寮傚父锛�" + ex.getMessage()); - } - } - return null; - } - - /** - * 鑾峰彇鏌愪釜妗朵笅鏌愪釜瀵硅薄鐨刄RL - * - * @param bucket 妗跺悕绉� - * @param objectName 瀵硅薄鍚� (鏂囦欢澶瑰悕 + 鏂囦欢鍚�) - * @return - */ - public static String getBucketObjectUrl(String bucketName, String objectName) { - try { - if (!exitsBucket(bucketName)) { - return ""; - } - GetPresignedObjectUrlArgs getPresignedObjectUrlArgs = GetPresignedObjectUrlArgs - .builder() - .bucket(bucketName) - .object(objectName) - .method(Method.GET) - .build(); - return MinioClientSingleton.getMinioClient().getPresignedObjectUrl(getPresignedObjectUrlArgs); - } catch (Exception ex) { - log.error("minio鑾峰彇瀵硅薄URL寮傚父" + ex.getMessage()); - } - return ""; - } - - /** - * 涓婁紶瀵硅薄-stream - * - * @param bucketName bucket鍚嶇О - * @param objectName 饨備欢鍚嶇О - * @param stream 饨備欢娴� - * @param size 饧も缉 - * @param contextType 绫诲瀷 Image/jpeg 娴忚鍣ㄥ彲浠ョ洿鎺ユ墦寮�锛屽惁鍒欎笅杞� - */ - public static boolean uploadObject(String bucketName, String objectName, InputStream stream, String contextType) { - try { - PutObjectArgs putObjectArgs = PutObjectArgs.builder() - .bucket(bucketName) - .object(objectName) - .stream(stream, stream.available(), -1) - .contentType(contextType) - .build(); - ObjectWriteResponse objectWriteResponse = MinioClientSingleton.getMinioClient().putObject(putObjectArgs); - return true; - } catch (Exception ex) { - log.error("minio涓婁紶鏂囦欢(閫氳繃stream)寮傚父" + ex.getMessage()); - return false; - } - } - - /** - * 涓婁紶瀵硅薄-File - * - * @param bucketName bucket鍚嶇О - * @param objectName 饨備欢鍚嶇О - * @param file 饨備欢 - * @param contextType 绫诲瀷 Image/jpeg 娴忚鍣ㄥ彲浠ョ洿鎺ユ墦寮�锛屽惁鍒欎笅杞� - */ - public static boolean uploadObject(String bucketName, String objectName, File file, String contextType) { - try { - FileInputStream fileInputStream = new FileInputStream(file); - PutObjectArgs putObjectArgs = PutObjectArgs.builder() - .bucket(bucketName) - .object(objectName) - .stream(fileInputStream, file.length(), -1) - .contentType(contextType) - .build(); - ObjectWriteResponse objectWriteResponse = MinioClientSingleton.getMinioClient().putObject(putObjectArgs); - return true; - } catch (Exception ex) { - log.error("minio涓婁紶鏂囦欢(閫氳繃File)寮傚父" + ex.getMessage()); - return false; - } - } - - /** - * 涓婁紶瀵硅薄-MultipartFile - * - * @param bucketName bucket鍚嶇О - * @param objectName 饨備欢鍚嶇О - * @param MultipartFile 饨備欢 - * @param contextType 绫诲瀷 Image/jpeg 娴忚鍣ㄥ彲浠ョ洿鎺ユ墦寮�锛屽惁鍒欎笅杞� - */ - public static boolean uploadObject(String bucketName, String objectName, MultipartFile multipartFile, String contextType) { - try { - if (bucketName.isEmpty()) { - log.error("bucket鍚嶇О涓虹┖"); - return false; - } - if (objectName.isEmpty()) { - log.error("瀵硅薄鍚嶇О涓虹┖"); - return false; - } - InputStream inputStream = multipartFile.getInputStream(); - PutObjectArgs putObjectArgs = PutObjectArgs.builder() - .bucket(bucketName) - .object(objectName) - .stream(inputStream, multipartFile.getSize(), -1) - .contentType(contextType) - .build(); - ObjectWriteResponse objectWriteResponse = MinioClientSingleton.getMinioClient().putObject(putObjectArgs); - return true; - } catch (Exception ex) { - log.error("minio涓婁紶鏂囦欢(閫氳繃File)寮傚父" + ex.getMessage()); - return false; - } - } - - /** - * 涓婁紶瀵硅薄,鐢╩ultipartFile鍚嶇О浣滀负瀵硅薄鍚� - * - * @param bucketName bucket鍚嶇О - * @param objectName 饨備欢鍚嶇О - * @param MultipartFile 饨備欢 - * @param contextType 绫诲瀷 Image/jpeg 娴忚鍣ㄥ彲浠ョ洿鎺ユ墦寮�锛屽惁鍒欎笅杞� - */ - public static boolean uploadObject(String bucketName, MultipartFile multipartFile, String contextType) { - try { - if (multipartFile == null) { - log.error("涓婁紶鏂囦欢涓虹┖"); - return false; - } - String objectName = multipartFile.getOriginalFilename(); - InputStream inputStream = multipartFile.getInputStream(); - PutObjectArgs putObjectArgs = PutObjectArgs.builder() - .bucket(bucketName) - .object(objectName) - .stream(inputStream, multipartFile.getSize(), -1) - .contentType(contextType) - .build(); - MinioClientSingleton.getMinioClient().putObject(putObjectArgs); - return true; - } catch (Exception ex) { - log.error("minio涓婁紶鏂囦欢(閫氳繃File)寮傚父" + ex.getMessage()); - return false; - } - } - - /** - * 涓婁紶瀵硅薄-閫氳繃鏈湴璺緞 - * - * @param bulkName - * @param objectName - * @param localFilePathName - * @return - */ - public static boolean uploadObject(String bulkName, String objectName, String localFilePathName, String contextType) { - try { - if (!exitsBucket(bulkName)) { - log.debug(bulkName + "涓嶅瓨鍦�"); - return false; - } - File file = new File(localFilePathName); - if (!file.exists()) { - log.debug("鏂囦欢涓嶅瓨鍦�"); - return false; - } - UploadObjectArgs uploadObjectArgs = UploadObjectArgs.builder() - .bucket(bulkName) - .object(objectName) - .filename(localFilePathName) - .contentType(contextType) - .build(); - ObjectWriteResponse objectWriteResponse = MinioClientSingleton.getMinioClient().uploadObject(uploadObjectArgs); - return true; - } catch (Exception e) { - log.error("minio upload object file error " + e.getMessage()); - return false; - } - } - /** - *@鎻忚堪 鑾峰彇妗朵腑鎵�鏈夊璞� - *@鍙傛暟 [bucketName] - *@杩斿洖鍊� java.lang.Iterable<io.minio.Result<io.minio.messages.Item>> - *@鍒涘缓浜� 鍒樿嫃涔� - *@鍒涘缓鏃堕棿 2023/2/6 10:32 - *@淇敼浜哄拰鍏跺畠淇℃伅 - */ - public static Iterable<Result<Item>> getObjectsByBucket(String bucketName) { - Iterable<Result<Item>> listObjects = MinioClientSingleton.getMinioClient().listObjects(ListObjectsArgs.builder() - .bucket(bucketName) - .recursive(true) - .build()); - return listObjects; - } - - public static void main(String[] args) { - // /*鍒犻櫎妗�*/ - // boolean b = removeBucket("lsy"); - // log.info(String.valueOf(b)); - // /*鍒涘缓妗�*/ - // boolean lsy = createBucket("lsy"); - // log.info(String.valueOf(lsy)); - // /*鍒ゆ柇妗舵槸鍚﹀瓨鍦�*/ - // boolean pic = exitsBucket("lsy"); - // log.info(String.valueOf(pic)); - /*鏌ヨ鎵�鏈夋《*/ - // List<Bucket> listBuckets = getListBuckets(); - // for (Bucket bucket : listBuckets) { - // log.info(bucket.name()); - // } - String bucket = "lsy"; - String filename = UUID.randomUUID().toString().replace("-", "") + "pic.jpeg"; - String fileFullPath = "C:\\Users\\Administrator\\Desktop\\寰俊鎴浘_20230518102605.png"; - // uploadObject(bucket, filename, fileFullPath, "Image/jpeg"); - // String url = getObjectWithExpired(bucket, filename, 10, SECONDS); - // System.out.println(url); - boolean b = removeBucket(bucket); - System.out.println(b); - // boolean b = uploadObjectBylocalPath(bucket, filename, fileFullPath); - // System.out.println(b); - //String url = getObjectWithExpired(bucket, filename, 10000); - // - //String url = getBucketObject(bucket, filename); - // System.out.println(url); package com.example.minio; - } -} \ No newline at end of file diff --git a/src/main/java/com/ard/utils/minio/MinioConfig.java b/src/main/java/com/ard/utils/minio/MinioConfig.java new file mode 100644 index 0000000..d5dada5 --- /dev/null +++ b/src/main/java/com/ard/utils/minio/MinioConfig.java @@ -0,0 +1,33 @@ +package com.ard.utils.minio; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; + +/** + * @Description: + * @ClassName: MinioClientSingleton + * @Author: 鍒樿嫃涔� + * @Date: 2023骞�05鏈�18鏃�9:32 + * @Version: 1.0 + **/ +@Slf4j(topic = "minio") +@Component +public class MinioConfig { + @Value("${spring.minio.endpoint}") + private String endpoint; + @Value("${spring.minio.accessKey}") + private String accessKey; + @Value("${spring.minio.secretKey}") + private String secretKey; + + @Bean + public io.minio.MinioClient getMinioClient() { + return io.minio.MinioClient.builder() + .endpoint(endpoint) + .credentials(accessKey, secretKey) + .build(); + } +} + diff --git a/src/main/java/com/ard/utils/minio/MinioUtils.java b/src/main/java/com/ard/utils/minio/MinioUtils.java new file mode 100644 index 0000000..d7e5e27 --- /dev/null +++ b/src/main/java/com/ard/utils/minio/MinioUtils.java @@ -0,0 +1,592 @@ +package com.ard.utils.minio; + +import com.ard.utils.other.StringUtils; +import com.ard.utils.uuid.IdUtils; +import io.minio.*; +import io.minio.http.Method; +import io.minio.messages.*; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.springframework.web.multipart.MultipartFile; +import javax.annotation.Resource; +import java.io.File; +import java.io.FileInputStream; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedList; +import java.util.List; +import java.util.concurrent.TimeUnit; + +/** + * @Description: Minio瀹㈡埛绔伐鍏风被 + * @ClassName: MinioUtils + * @Author: 鍒樿嫃涔� + * @Date: 2023骞�05鏈�18鏃�9:34 + * @Version: 1.0 + **/ +@SuppressWarnings("ALL") +@Slf4j(topic = "minio") +@Component +public class MinioUtils { + + @Resource + MinioClient minioClient; + + /** + * 鍒ゆ柇妗舵槸鍚﹀瓨鍦� + */ + public boolean exitsBucket(String bucketName) { + boolean found = false; + try { + if (StringUtils.isEmpty(bucketName)) { + return false; + } + BucketExistsArgs bucketExistsArgs = BucketExistsArgs.builder().bucket(bucketName).build(); + found = minioClient.bucketExists(bucketExistsArgs); + + } catch (Exception ex) { + log.error("minio鍒ゆ柇妗跺瓨鍦ㄥ紓甯革細", ex.getMessage()); + } + return found; + } + + /** + * 鍒涘缓妗�,骞惰缃《绛栫暐涓哄叕鍏� + */ + public boolean createBucket(String bucketName) { + try { + if (StringUtils.isEmpty(bucketName)) { + return false; + } + /*鍒涘缓妗�*/ + MakeBucketArgs makeBucketArgs = MakeBucketArgs.builder().bucket(bucketName).build(); + minioClient.makeBucket(makeBucketArgs); + /*璁剧疆绛栫暐*/ + String sb = "{\"Version\":\"2012-10-17\"," + + "\"Statement\":[{\"Effect\":\"Allow\",\"Principal\":" + + "{\"AWS\":[\"*\"]},\"Action\":[\"s3:ListBucket\",\"s3:ListBucketMultipartUploads\"," + + "\"s3:GetBucketLocation\"],\"Resource\":[\"arn:aws:s3:::" + bucketName + + "\"]},{\"Effect\":\"Allow\",\"Principal\":{\"AWS\":[\"*\"]},\"Action\":[\"s3:PutObject\",\"s3:AbortMultipartUpload\",\"s3:DeleteObject\",\"s3:GetObject\",\"s3:ListMultipartUploadParts\"],\"Resource\":[\"arn:aws:s3:::" + + bucketName + "/*\"]}]}"; + SetBucketPolicyArgs setBucketPolicyArgs = SetBucketPolicyArgs.builder() + .bucket(bucketName) + .config(sb) + .build(); + /*璁剧疆閫氱煡mqtt*/ + //璁剧疆mqtt涓婚 + NotificationConfiguration config = new NotificationConfiguration(); + List<QueueConfiguration> queueConfigurations = new ArrayList<>(); + QueueConfiguration queueConfiguration = new QueueConfiguration(); + queueConfiguration.setQueue("arn:minio:sqs::_:mqtt"); + + //璁剧疆浜嬩欢 + List<EventType> events = new ArrayList<>(); + events.add(EventType.OBJECT_REMOVED_ANY); + events.add(EventType.OBJECT_CREATED_ANY); + queueConfiguration.setEvents(events); + + queueConfigurations.add(queueConfiguration); + config.setQueueConfigurationList(queueConfigurations); + SetBucketNotificationArgs setBucketNotificationArgs = SetBucketNotificationArgs.builder() + .bucket(bucketName) + .config(config).build(); + minioClient.setBucketPolicy(setBucketPolicyArgs); + minioClient.setBucketNotification(setBucketNotificationArgs); + + return true; + } catch (Exception ex) { + log.error("minio鍒涘缓妗跺紓甯革細", ex.getMessage()); + return false; + } + } + + /** + * 鍒犻櫎涓�涓《 + * + * @param bucket 妗跺悕绉� + */ + public boolean removeBucket(String bucket) { + try { + boolean found = exitsBucket(bucket); + if (found) { + Iterable<Result<Item>> myObjects = minioClient.listObjects(ListObjectsArgs.builder().bucket(bucket).build()); + for (Result<Item> result : myObjects) { + Item item = result.get(); + //鏈夊璞℃枃浠讹紝鍒欏垹闄ゅけ璐� + if (item.size() > 0) { + return false; + } + } + // 鍒犻櫎`bucketName`瀛樺偍妗讹紝娉ㄦ剰锛屽彧鏈夊瓨鍌ㄦ《涓虹┖鏃舵墠鑳藉垹闄ゆ垚鍔熴�� + minioClient.removeBucket(RemoveBucketArgs.builder().bucket(bucket).build()); + found = exitsBucket(bucket); + return !found; + } + } catch (Exception ex) { + log.error("鍒犻櫎妗跺紓甯革細" + ex.getMessage()); + } + return false; + } + + /** + * 鏌ヨ鎵�鏈夋《鏂囦欢 + * + * @return + */ + public List<Bucket> getListBuckets() { + try { + return minioClient.listBuckets(); + } catch (Exception e) { + e.printStackTrace(); + } + return Collections.emptyList(); + } + + /** + * 鐢熸垚涓�涓狦ET璇锋眰鐨勫甫鏈夊け鏁堟椂闂寸殑鍒嗕韩閾炬帴銆� + * 澶辨晥鏃堕棿榛樿鏄�7澶┿�� + * + * @param bucketName 瀛樺偍妗跺悕绉� + * @param objectName 瀛樺偍妗堕噷鐨勫璞″悕绉� + * @param expires 澶辨晥鏃堕棿锛堜互绉掍负鍗曚綅锛夛紝榛樿鏄�7澶╋紝涓嶅緱澶т簬涓冨ぉ + * @return + */ + public String getObjectWithExpired(String bucketName, String objectName, Integer expires, TimeUnit timeUnit) { + String url = ""; + if (exitsBucket(bucketName)) { + try { + GetPresignedObjectUrlArgs getPresignedObjectUrlArgs = GetPresignedObjectUrlArgs.builder() + .method(Method.GET) + .bucket(bucketName) + .object(objectName) + .expiry(expires, timeUnit) + .build(); + url = minioClient.getPresignedObjectUrl(getPresignedObjectUrlArgs); + } catch (Exception ex) { + log.error("minio鐢熸垚澶辨晥url寮傚父", ex.getMessage()); + } + } else { + createBucket(bucketName); + } + return url; + } + + /** + * @鎻忚堪 涓婁紶MultipartFile鏂囦欢杩斿洖url + * @鍙傛暟 [bucketName, file] + * @杩斿洖鍊� java.lang.String + * @鍒涘缓浜� 鍒樿嫃涔� + * @鍒涘缓鏃堕棿 2023/5/18 12:16 + * @淇敼浜哄拰鍏跺畠淇℃伅 + */ + public String putObjectAndGetUrl(String bucketName, MultipartFile file) { + if (!exitsBucket(bucketName)) { + createBucket(bucketName); + } + //鍒ゆ柇鏂囦欢鏄惁涓虹┖ + if (null == file || 0 == file.getSize()) { + log.error("涓婁紶minio鏂囦欢鏈嶅姟鍣ㄩ敊璇紝涓婁紶鏂囦欢涓虹┖"); + } + boolean exsit = exitsBucket(bucketName); + if (!exsit) { + boolean bucket = createBucket(bucketName); + if (bucket) { + log.info(bucketName + "-妗朵笉瀛樺湪,鎴愬姛鍒涘缓妗�"); + } + } + //鏂囦欢鍚� + String originalFilename = file.getOriginalFilename(); + //鏂扮殑鏂囦欢鍚� + String fileName = IdUtils.fastSimpleUUID() + "_" + originalFilename; + try { + InputStream inputStream = file.getInputStream(); + /*涓婁紶瀵硅薄*/ + PutObjectArgs putObjectArgs = PutObjectArgs + .builder() + .bucket(bucketName) + .object(fileName) + .stream(inputStream, file.getSize(), -1) + .contentType(file.getContentType()) + .build(); + minioClient.putObject(putObjectArgs); + inputStream.close(); + /*鑾峰彇url*/ + GetPresignedObjectUrlArgs getPresignedObjectUrlArgs = GetPresignedObjectUrlArgs + .builder() + .bucket(bucketName) + .object(fileName) + .method(Method.GET) + .build(); + String presignedObjectUrl = minioClient.getPresignedObjectUrl(getPresignedObjectUrlArgs); + String ObjectUrl = presignedObjectUrl.substring(0, presignedObjectUrl.indexOf("?")); + return ObjectUrl; + } catch (Exception ex) { + log.error("涓婁紶瀵硅薄杩斿洖url寮傚父锛�" + ex.getMessage()); + } + return ""; + } + + /** + * @鎻忚堪 涓婁紶MultipartFile鏂囦欢杩斿洖url + * @鍙傛暟 [bucketName, file] + * @杩斿洖鍊� java.lang.String + * @鍒涘缓浜� 鍒樿嫃涔� + * @鍒涘缓鏃堕棿 2023/5/18 12:16 + * @淇敼浜哄拰鍏跺畠淇℃伅 + */ + public String putObjectAndGetUrl(String bucketName, String folder, MultipartFile file) { + if (!exitsBucket(bucketName)) { + createBucket(bucketName); + } + //鍒ゆ柇鏂囦欢鏄惁涓虹┖ + if (null == file || 0 == file.getSize()) { + log.error("涓婁紶minio鏂囦欢鏈嶅姟鍣ㄩ敊璇紝涓婁紶鏂囦欢涓虹┖"); + } + boolean exsit = exitsBucket(bucketName); + if (!exsit) { + boolean bucket = createBucket(bucketName); + if (bucket) { + log.info(bucketName + "-妗朵笉瀛樺湪,鎴愬姛鍒涘缓妗�"); + } + } + //鏂囦欢鍚� + String originalFilename = file.getOriginalFilename(); + //鏂扮殑鏂囦欢鍚� + String fileName = folder + "/" + IdUtils.fastSimpleUUID() + "_" + originalFilename; + try { + InputStream inputStream = file.getInputStream(); + /*涓婁紶瀵硅薄*/ + PutObjectArgs putObjectArgs = PutObjectArgs + .builder() + .bucket(bucketName) + .object(fileName) + .stream(inputStream, file.getSize(), -1) + .contentType(file.getContentType()) + .build(); + minioClient.putObject(putObjectArgs); + inputStream.close(); + /*鑾峰彇url*/ + GetPresignedObjectUrlArgs getPresignedObjectUrlArgs = GetPresignedObjectUrlArgs + .builder() + .bucket(bucketName) + .object(fileName) + .method(Method.GET) + .build(); + String presignedObjectUrl = minioClient.getPresignedObjectUrl(getPresignedObjectUrlArgs); + String ObjectUrl = presignedObjectUrl.substring(0, presignedObjectUrl.indexOf("?")); + return ObjectUrl; + } catch (Exception ex) { + log.error("涓婁紶瀵硅薄杩斿洖url寮傚父锛�" + ex.getMessage()); + } + return ""; + } + + /** + * 鍒犻櫎鏂囦欢 + * + * @param bucket 妗跺悕绉� + * @param objectName 瀵硅薄鍚嶇О + * @return boolean + */ + public boolean removeObject(String bucket, String objectName) { + try { + boolean exsit = exitsBucket(bucket); + if (exsit) { + RemoveObjectArgs removeObjectArgs = RemoveObjectArgs.builder().bucket(bucket).object(objectName).build(); + minioClient.removeObject(removeObjectArgs); + return true; + } + } catch (Exception e) { + log.error("removeObject", e); + } + return false; + } + + /** + * 鎵归噺鍒犻櫎鏂囦欢 + * + * @param objectNames 瀵硅薄鍚嶇О + * @return boolean + */ + public boolean removeObjects(String bucket, List<String> objectNames) { + if (exitsBucket(bucket)) { + try { + List<DeleteObject> objects = new LinkedList<>(); + for (String str : objectNames) { + objects.add(new DeleteObject(str)); + } + RemoveObjectsArgs removeObjectsArgs = RemoveObjectsArgs.builder().bucket(bucket).objects(objects).build(); + Iterable<Result<DeleteError>> results = minioClient.removeObjects(removeObjectsArgs); + /*鍒犻櫎瀹岄亶鍘嗙粨鏋滐紝鍚﹀垯鍒犱笉鎺�*/ + for (Result<DeleteError> result : results) { + DeleteError error = result.get(); + log.error("Error in deleting object " + error.objectName() + "; " + error.message()); + } + + return true; + } catch (Exception ex) { + log.error("minio鎵归噺鍒犻櫎鏂囦欢寮傚父", ex.getMessage()); + } + } + return false; + } + + /** + * 鑾峰彇鍗曚釜妗朵腑鐨勬墍鏈夋枃浠跺璞″悕绉� + * + * @param bucket 妗跺悕绉� + * @return {@link List}<{@link String}> + */ + public List<String> getBucketObjectName(String bucket) { + boolean exsit = exitsBucket(bucket); + if (exsit) { + List<String> listObjetcName = new ArrayList<>(); + try { + ListObjectsArgs listObjectsArgs = ListObjectsArgs.builder().bucket(bucket).build(); + Iterable<Result<Item>> myObjects = minioClient.listObjects(listObjectsArgs); + for (Result<Item> result : myObjects) { + Item item = result.get(); + listObjetcName.add(item.objectName()); + } + return listObjetcName; + } catch (Exception ex) { + log.error("minio鑾峰彇妗朵笅瀵硅薄寮傚父锛�" + ex.getMessage()); + } + } + return null; + } + + /** + * 鑾峰彇鍗曚釜妗朵腑鐨勬墍鏈夋枃浠跺璞″悕绉� + * @param [bucket,prefix] + * @return {@link List}<{@link String}> + */ + public List<String> getBucketObjectName(String bucket, String prefix) { + boolean exsit = exitsBucket(bucket); + if (exsit) { + List<String> listObjetcName = new ArrayList<>(); + try { + ListObjectsArgs listObjectsArgs = ListObjectsArgs.builder().prefix(prefix).bucket(bucket).build(); + Iterable<Result<Item>> myObjects = minioClient.listObjects(listObjectsArgs); + for (Result<Item> result : myObjects) { + Item item = result.get(); + listObjetcName.add(item.objectName()); + } + return listObjetcName; + } catch (Exception ex) { + log.error("minio鑾峰彇妗朵笅瀵硅薄寮傚父锛�" + ex.getMessage()); + } + } + return null; + } + + /** + * 鑾峰彇鏌愪釜妗朵笅鏌愪釜瀵硅薄鐨刄RL + * + * @param bucket 妗跺悕绉� + * @param objectName 瀵硅薄鍚� (鏂囦欢澶瑰悕 + 鏂囦欢鍚�) + * @return + */ + public String getBucketObjectUrl(String bucketName, String objectName) { + try { + if (!exitsBucket(bucketName)) { + return ""; + } + GetPresignedObjectUrlArgs getPresignedObjectUrlArgs = GetPresignedObjectUrlArgs + .builder() + .bucket(bucketName) + .object(objectName) + .method(Method.GET) + .build(); + String presignedObjectUrl = minioClient.getPresignedObjectUrl(getPresignedObjectUrlArgs); + String ObjectUrl = presignedObjectUrl.substring(0, presignedObjectUrl.indexOf("?")); + return ObjectUrl; + } catch (Exception ex) { + log.error("minio鑾峰彇瀵硅薄URL寮傚父" + ex.getMessage()); + } + return ""; + } + + /** + * 涓婁紶瀵硅薄-stream + * + * @param bucketName bucket鍚嶇О + * @param objectName 饨備欢鍚嶇О + * @param stream 饨備欢娴� + * @param size 饧も缉 + * @param contextType 绫诲瀷 Image/jpeg 娴忚鍣ㄥ彲浠ョ洿鎺ユ墦寮�锛屽惁鍒欎笅杞� + */ + public boolean uploadObject(String bucketName, String objectName, InputStream stream, long size, String contextType) { + try { + if (!exitsBucket(bucketName)) { + createBucket(bucketName); + } + PutObjectArgs putObjectArgs = PutObjectArgs.builder() + .bucket(bucketName) + .object(objectName) + .stream(stream, size, -1) + .contentType(contextType) + .build(); + ObjectWriteResponse objectWriteResponse = minioClient.putObject(putObjectArgs); + return true; + } catch (Exception ex) { + log.error("minio涓婁紶鏂囦欢(閫氳繃stream)寮傚父" + ex.getMessage()); + return false; + } + } + + /** + * 涓婁紶瀵硅薄-File + * + * @param bucketName bucket鍚嶇О + * @param objectName 饨備欢鍚嶇О + * @param file 饨備欢 + * @param contextType 绫诲瀷 Image/jpeg 娴忚鍣ㄥ彲浠ョ洿鎺ユ墦寮�锛屽惁鍒欎笅杞� + */ + public boolean uploadObject(String bucketName, String objectName, File file, String contextType) { + try { + if (!exitsBucket(bucketName)) { + createBucket(bucketName); + } + FileInputStream fileInputStream = new FileInputStream(file); + PutObjectArgs putObjectArgs = PutObjectArgs.builder() + .bucket(bucketName) + .object(objectName) + .stream(fileInputStream, file.length(), -1) + .contentType(contextType) + .build(); + ObjectWriteResponse objectWriteResponse = minioClient.putObject(putObjectArgs); + return true; + } catch (Exception ex) { + log.error("minio涓婁紶鏂囦欢(閫氳繃File)寮傚父" + ex.getMessage()); + return false; + } + } + + /** + * 涓婁紶瀵硅薄-MultipartFile + * + * @param bucketName bucket鍚嶇О + * @param objectName 饨備欢鍚嶇О + * @param MultipartFile 饨備欢 + * @param contextType 绫诲瀷 Image/jpeg 娴忚鍣ㄥ彲浠ョ洿鎺ユ墦寮�锛屽惁鍒欎笅杞� + */ + public boolean uploadObject(String bucketName, String objectName, MultipartFile multipartFile, String contextType) { + try { + if (!exitsBucket(bucketName)) { + createBucket(bucketName); + } + InputStream inputStream = multipartFile.getInputStream(); + PutObjectArgs putObjectArgs = PutObjectArgs.builder() + .bucket(bucketName) + .object(objectName) + .stream(inputStream, multipartFile.getSize(), -1) + .contentType(contextType) + .build(); + ObjectWriteResponse objectWriteResponse = minioClient.putObject(putObjectArgs); + return true; + } catch (Exception ex) { + log.error("minio涓婁紶鏂囦欢(閫氳繃File)寮傚父" + ex.getMessage()); + return false; + } + } + + /** + * 涓婁紶瀵硅薄,鐢╩ultipartFile鍚嶇О浣滀负瀵硅薄鍚� + * + * @param bucketName bucket鍚嶇О + * @param objectName 饨備欢鍚嶇О + * @param MultipartFile 饨備欢 + * @param contextType 绫诲瀷 Image/jpeg 娴忚鍣ㄥ彲浠ョ洿鎺ユ墦寮�锛屽惁鍒欎笅杞� + */ + public boolean uploadObject(String bucketName, MultipartFile multipartFile, String contextType) { + try { + if (!exitsBucket(bucketName)) { + createBucket(bucketName); + } + if (multipartFile == null) { + log.error("涓婁紶鏂囦欢涓虹┖"); + return false; + } + String objectName = multipartFile.getOriginalFilename(); + InputStream inputStream = multipartFile.getInputStream(); + PutObjectArgs putObjectArgs = PutObjectArgs.builder() + .bucket(bucketName) + .object(objectName) + .stream(inputStream, multipartFile.getSize(), -1) + .contentType(contextType) + .build(); + minioClient.putObject(putObjectArgs); + return true; + } catch (Exception ex) { + log.error("minio涓婁紶鏂囦欢(閫氳繃File)寮傚父" + ex.getMessage()); + return false; + } + } + + /** + * 涓婁紶瀵硅薄-閫氳繃鏈湴璺緞 + * + * @param bulkName + * @param objectName + * @param localFilePathName + * @return + */ + public boolean uploadObject(String bucketName, String objectName, String localFilePathName, String contextType) { + try { + if (!exitsBucket(bucketName)) { + createBucket(bucketName); + } + File file = new File(localFilePathName); + if (!file.exists()) { + log.debug("鏂囦欢涓嶅瓨鍦�"); + return false; + } + UploadObjectArgs uploadObjectArgs = UploadObjectArgs.builder() + .bucket(bucketName) + .object(objectName) + .filename(localFilePathName) + .contentType(contextType) + .build(); + ObjectWriteResponse objectWriteResponse = minioClient.uploadObject(uploadObjectArgs); + return true; + } catch (Exception e) { + log.error("minio upload object file error " + e.getMessage()); + return false; + } + } + + /** + * @鎻忚堪 鑾峰彇妗朵腑鎵�鏈夊璞� + * @鍙傛暟 [bucketName] + * @杩斿洖鍊� java.lang.Iterable<io.minio.Result < io.minio.messages.Item>> + * @鍒涘缓浜� 鍒樿嫃涔� + * @鍒涘缓鏃堕棿 2023/2/6 10:32 + * @淇敼浜哄拰鍏跺畠淇℃伅 + */ + public Iterable<Result<Item>> getObjectsByBucket(String bucketName) { + Iterable<Result<Item>> listObjects = minioClient.listObjects(ListObjectsArgs.builder() + .bucket(bucketName) + .recursive(true) + .build()); + return listObjects; + } + + /** + * @鎻忚堪 鑾峰彇妗朵腑鎵�鏈夊璞� + * @鍙傛暟 [bucketName,prefix] + * @杩斿洖鍊� java.lang.Iterable<io.minio.Result < io.minio.messages.Item>> + * @鍒涘缓浜� 鍒樿嫃涔� + * @鍒涘缓鏃堕棿 2023/2/6 10:32 + * @淇敼浜哄拰鍏跺畠淇℃伅 + */ + public Iterable<Result<Item>> getObjectsByBucket(String bucketName, String prefix) { + Iterable<Result<Item>> listObjects = minioClient.listObjects(ListObjectsArgs.builder() + .bucket(bucketName) + .prefix(prefix) + .recursive(true) + .build()); + return listObjects; + } +} \ No newline at end of file diff --git a/src/main/java/com/ard/utils/mqtt/MqttConsumer.java b/src/main/java/com/ard/utils/mqtt/MqttConsumer.java index 6c80d29..fc03b39 100644 --- a/src/main/java/com/ard/utils/mqtt/MqttConsumer.java +++ b/src/main/java/com/ard/utils/mqtt/MqttConsumer.java @@ -4,6 +4,7 @@ import org.apache.commons.lang3.StringUtils; import org.eclipse.paho.client.mqttv3.*; import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence; +import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; import org.springframework.core.annotation.Order; @@ -23,13 +24,29 @@ @Slf4j(topic = "mqtt") @Order(1) public class MqttConsumer implements ApplicationRunner { + @Value("${spring.mqtt.enabled}") + private Boolean MQTT_ENABLED; + @Value("${spring.mqtt.topic}") + private String MQTT_TOPIC; + @Value("${spring.mqtt.host}") + private String MQTT_HOST; + @Value("${spring.mqtt.clientId}") + private String MQTT_CLIENT_ID; + @Value("${spring.mqtt.username}") + private String MQTT_USER_NAME; + @Value("${spring.mqtt.password}") + private String MQTT_PASSWORD; + @Value("${spring.mqtt.timeout}") + private int MQTT_TIMEOUT; + @Value("${spring.mqtt.keepalive}") + private int MQTT_KEEP_ALIVE; private static MqttClient client; @Override public void run(ApplicationArguments args) { log.debug("鍒濆鍖栧苟鍚姩mqtt......"); - if (PropertiesUtil.MQTT_ENABLED) { + if (MQTT_ENABLED) { this.connect(); } } @@ -43,7 +60,7 @@ getClient(); // 2 璁剧疆閰嶇疆 MqttConnectOptions options = getOptions(); - String[] topic = PropertiesUtil.MQTT_TOPIC.split(","); + String[] topic = MQTT_TOPIC.split(","); // 3 娑堟伅鍙戝竷璐ㄩ噺 int[] qos = getQos(topic.length); // 4 鏈�鍚庤缃� @@ -59,7 +76,7 @@ public void getClient() { try { if (null == client) { - client = new MqttClient(PropertiesUtil.MQTT_HOST, PropertiesUtil.MQTT_CLIENT_ID, new MemoryPersistence()); + client = new MqttClient(MQTT_HOST, MQTT_CLIENT_ID, new MemoryPersistence()); } log.debug("--鍒涘缓mqtt瀹㈡埛绔�"); } catch (Exception e) { @@ -73,12 +90,12 @@ public MqttConnectOptions getOptions() { MqttConnectOptions options = new MqttConnectOptions(); //璁剧疆鐢ㄦ埛鍚嶅瘑鐮� - options.setUserName(PropertiesUtil.MQTT_USER_NAME); - options.setPassword(PropertiesUtil.MQTT_PASSWORD.toCharArray()); + options.setUserName(MQTT_USER_NAME); + options.setPassword(MQTT_PASSWORD.toCharArray()); // 璁剧疆瓒呮椂鏃堕棿 - options.setConnectionTimeout(PropertiesUtil.MQTT_TIMEOUT); + options.setConnectionTimeout(MQTT_TIMEOUT); // 璁剧疆浼氳瘽蹇冭烦鏃堕棿 - options.setKeepAliveInterval(PropertiesUtil.MQTT_KEEP_ALIVE); + options.setKeepAliveInterval(MQTT_KEEP_ALIVE); // 鏄惁娓呴櫎session options.setCleanSession(true); log.debug("--鐢熸垚mqtt閰嶇疆瀵硅薄"); diff --git a/src/main/java/com/ard/utils/mqtt/MqttConsumerCallback.java b/src/main/java/com/ard/utils/mqtt/MqttConsumerCallback.java index 20e9f7c..b0ee239 100644 --- a/src/main/java/com/ard/utils/mqtt/MqttConsumerCallback.java +++ b/src/main/java/com/ard/utils/mqtt/MqttConsumerCallback.java @@ -81,10 +81,10 @@ if (null != topic && null != qos) { if (client.isConnected()) { client.subscribe(topic, qos); - log.debug("mqtt杩炴帴鎴愬姛锛屽鎴风ID锛�" + PropertiesUtil.MQTT_CLIENT_ID); + log.debug("mqtt杩炴帴鎴愬姛"); log.debug("--璁㈤槄涓婚:锛�" + Arrays.toString(topic)); } else { - log.debug("mqtt杩炴帴澶辫触锛屽鎴风ID锛�" + PropertiesUtil.MQTT_CLIENT_ID); + log.debug("mqtt杩炴帴澶辫触"); } } } catch (Exception e) { diff --git a/src/main/java/com/ard/utils/mqtt/PropertiesUtil.java b/src/main/java/com/ard/utils/mqtt/PropertiesUtil.java deleted file mode 100644 index d53dc88..0000000 --- a/src/main/java/com/ard/utils/mqtt/PropertiesUtil.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.ard.utils.mqtt; - -import org.springframework.beans.factory.config.YamlPropertiesFactoryBean; -import org.springframework.core.io.ClassPathResource; -import org.springframework.core.io.Resource; -import org.springframework.stereotype.Component; - -import java.util.Objects; -import java.util.Properties; - -/** - * @Description: 鑾峰彇閰嶇疆淇℃伅 - * @ClassName: PropertiesUtil - * @Author: 鍒樿嫃涔� - * @Date: 2023骞�06鏈�06鏃�9:40 - * @Version: 1.0 - **/ -@Component -public class PropertiesUtil { - - public static String MQTT_HOST; - public static String MQTT_CLIENT_ID; - public static String MQTT_USER_NAME; - public static String MQTT_PASSWORD; - public static String MQTT_TOPIC; - public static Integer MQTT_TIMEOUT; - public static Integer MQTT_KEEP_ALIVE; - public static Boolean MQTT_ENABLED; - static { - MQTT_HOST = getYmlNew("spring.mqtt.host"); - MQTT_CLIENT_ID = getYmlNew("spring.mqtt.clientId"); - MQTT_USER_NAME = getYmlNew("spring.mqtt.username"); - MQTT_PASSWORD = getYmlNew("spring.mqtt.password"); - MQTT_TOPIC = getYmlNew("spring.mqtt.topic"); - MQTT_TIMEOUT = Integer.valueOf(Objects.requireNonNull(getYmlNew("spring.mqtt.timeout"))); - MQTT_KEEP_ALIVE = Integer.valueOf(Objects.requireNonNull(getYmlNew("spring.mqtt.keepalive"))); - MQTT_ENABLED = Boolean.valueOf(getYmlNew("spring.mqtt.enabled")); - } - - public static String getYmlNew(String key) { - Resource resource = new ClassPathResource("application.yml"); - Properties properties; - try { - YamlPropertiesFactoryBean yamlFactory = new YamlPropertiesFactoryBean(); - yamlFactory.setResources(resource); - properties = yamlFactory.getObject(); - } catch (Exception e) { - e.printStackTrace(); - return null; - } - assert properties != null; - return properties.get(key).toString(); - } -} diff --git a/src/main/java/com/ard/utils/other/SpringTool.java b/src/main/java/com/ard/utils/other/SpringTool.java deleted file mode 100644 index 1c0844d..0000000 --- a/src/main/java/com/ard/utils/other/SpringTool.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.ard.utils.other; - -import org.springframework.beans.BeansException; -import org.springframework.beans.factory.config.YamlPropertiesFactoryBean; -import org.springframework.context.ApplicationContext; -import org.springframework.context.ApplicationContextAware; -import org.springframework.core.io.ClassPathResource; -import org.springframework.core.io.Resource; -import org.springframework.stereotype.Component; - -import java.util.Properties; - -/** - * @Description: - * @ClassName: SpringTool - * @Author: 鍒樿嫃涔� - * @Date: 2023骞�06鏈�06鏃�9:14 - * @Version: 1.0 - **/ -@Component -public class SpringTool implements ApplicationContextAware { - - private static ApplicationContext applicationContext = null; - - @Override - public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { - if (SpringTool.applicationContext == null) { - SpringTool.applicationContext = applicationContext; - } - } - - //璇ユ柟娉曠敤浜庡鐣岃幏鍙朅pplicationContext瀵硅薄 - public static ApplicationContext getApplicationContext() { - return applicationContext; - } - - //璇ユ柟娉曠敤浜庡鐣岄�氳繃bean鐨勫悕瀛楄幏鍙朆ean瀵硅薄 - public static Object getBean(String name) { - return getApplicationContext().getBean(name); - } - - /*yml閰嶇疆淇℃伅鑾峰彇*/ - public static String getYmlInfo(String key) { - Resource resource = new ClassPathResource("application.yml"); - Properties properties = null; - try { - YamlPropertiesFactoryBean yamlFactory = new YamlPropertiesFactoryBean(); - yamlFactory.setResources(resource); - properties = yamlFactory.getObject(); - } catch (Exception e) { - e.printStackTrace(); - return null; - } - return properties.get(key).toString(); - } -} \ No newline at end of file diff --git a/src/main/java/com/ard/utils/other/StringUtils.java b/src/main/java/com/ard/utils/other/StringUtils.java new file mode 100644 index 0000000..0980747 --- /dev/null +++ b/src/main/java/com/ard/utils/other/StringUtils.java @@ -0,0 +1,577 @@ +package com.ard.utils.other; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import org.springframework.util.AntPathMatcher; + +/** + * 瀛楃涓插伐鍏风被 + * + * @author ruoyi + */ +public class StringUtils extends org.apache.commons.lang3.StringUtils +{ + /** 绌哄瓧绗︿覆 */ + private static final String NULLSTR = ""; + + /** 涓嬪垝绾� */ + private static final char SEPARATOR = '_'; + + /** + * 鑾峰彇鍙傛暟涓嶄负绌哄�� + * + * @param value defaultValue 瑕佸垽鏂殑value + * @return value 杩斿洖鍊� + */ + public static <T> T nvl(T value, T defaultValue) + { + return value != null ? value : defaultValue; + } + + /** + * * 鍒ゆ柇涓�涓狢ollection鏄惁涓虹┖锛� 鍖呭惈List锛孲et锛孮ueue + * + * @param coll 瑕佸垽鏂殑Collection + * @return true锛氫负绌� false锛氶潪绌� + */ + public static boolean isEmpty(Collection<?> coll) + { + return isNull(coll) || coll.isEmpty(); + } + + /** + * * 鍒ゆ柇涓�涓狢ollection鏄惁闈炵┖锛屽寘鍚獿ist锛孲et锛孮ueue + * + * @param coll 瑕佸垽鏂殑Collection + * @return true锛氶潪绌� false锛氱┖ + */ + public static boolean isNotEmpty(Collection<?> coll) + { + return !isEmpty(coll); + } + + /** + * * 鍒ゆ柇涓�涓璞℃暟缁勬槸鍚︿负绌� + * + * @param objects 瑕佸垽鏂殑瀵硅薄鏁扮粍 + ** @return true锛氫负绌� false锛氶潪绌� + */ + public static boolean isEmpty(Object[] objects) + { + return isNull(objects) || (objects.length == 0); + } + + /** + * * 鍒ゆ柇涓�涓璞℃暟缁勬槸鍚﹂潪绌� + * + * @param objects 瑕佸垽鏂殑瀵硅薄鏁扮粍 + * @return true锛氶潪绌� false锛氱┖ + */ + public static boolean isNotEmpty(Object[] objects) + { + return !isEmpty(objects); + } + + /** + * * 鍒ゆ柇涓�涓狹ap鏄惁涓虹┖ + * + * @param map 瑕佸垽鏂殑Map + * @return true锛氫负绌� false锛氶潪绌� + */ + public static boolean isEmpty(Map<?, ?> map) + { + return isNull(map) || map.isEmpty(); + } + + /** + * * 鍒ゆ柇涓�涓狹ap鏄惁涓虹┖ + * + * @param map 瑕佸垽鏂殑Map + * @return true锛氶潪绌� false锛氱┖ + */ + public static boolean isNotEmpty(Map<?, ?> map) + { + return !isEmpty(map); + } + + /** + * * 鍒ゆ柇涓�涓瓧绗︿覆鏄惁涓虹┖涓� + * + * @param str String + * @return true锛氫负绌� false锛氶潪绌� + */ + public static boolean isEmpty(String str) + { + return isNull(str) || NULLSTR.equals(str.trim()); + } + + /** + * * 鍒ゆ柇涓�涓瓧绗︿覆鏄惁涓洪潪绌轰覆 + * + * @param str String + * @return true锛氶潪绌轰覆 false锛氱┖涓� + */ + public static boolean isNotEmpty(String str) + { + return !isEmpty(str); + } + + /** + * * 鍒ゆ柇涓�涓璞℃槸鍚︿负绌� + * + * @param object Object + * @return true锛氫负绌� false锛氶潪绌� + */ + public static boolean isNull(Object object) + { + return object == null; + } + + /** + * * 鍒ゆ柇涓�涓璞℃槸鍚﹂潪绌� + * + * @param object Object + * @return true锛氶潪绌� false锛氱┖ + */ + public static boolean isNotNull(Object object) + { + return !isNull(object); + } + + /** + * * 鍒ゆ柇涓�涓璞℃槸鍚︽槸鏁扮粍绫诲瀷锛圝ava鍩烘湰鍨嬪埆鐨勬暟缁勶級 + * + * @param object 瀵硅薄 + * @return true锛氭槸鏁扮粍 false锛氫笉鏄暟缁� + */ + public static boolean isArray(Object object) + { + return isNotNull(object) && object.getClass().isArray(); + } + + /** + * 鍘荤┖鏍� + */ + public static String trim(String str) + { + return (str == null ? "" : str.trim()); + } + + /** + * 鎴彇瀛楃涓� + * + * @param str 瀛楃涓� + * @param start 寮�濮� + * @return 缁撴灉 + */ + public static String substring(final String str, int start) + { + if (str == null) + { + return NULLSTR; + } + + if (start < 0) + { + start = str.length() + start; + } + + if (start < 0) + { + start = 0; + } + if (start > str.length()) + { + return NULLSTR; + } + + return str.substring(start); + } + + /** + * 鎴彇瀛楃涓� + * + * @param str 瀛楃涓� + * @param start 寮�濮� + * @param end 缁撴潫 + * @return 缁撴灉 + */ + public static String substring(final String str, int start, int end) + { + if (str == null) + { + return NULLSTR; + } + + if (end < 0) + { + end = str.length() + end; + } + if (start < 0) + { + start = str.length() + start; + } + + if (end > str.length()) + { + end = str.length(); + } + + if (start > end) + { + return NULLSTR; + } + + if (start < 0) + { + start = 0; + } + if (end < 0) + { + end = 0; + } + + return str.substring(start, end); + } + + + + + /** + * 瀛楃涓茶浆set + * + * @param str 瀛楃涓� + * @param sep 鍒嗛殧绗� + * @return set闆嗗悎 + */ + public static final Set<String> str2Set(String str, String sep) + { + return new HashSet<String>(str2List(str, sep, true, false)); + } + + /** + * 瀛楃涓茶浆list + * + * @param str 瀛楃涓� + * @param sep 鍒嗛殧绗� + * @param filterBlank 杩囨护绾┖鐧� + * @param trim 鍘绘帀棣栧熬绌虹櫧 + * @return list闆嗗悎 + */ + public static final List<String> str2List(String str, String sep, boolean filterBlank, boolean trim) + { + List<String> list = new ArrayList<String>(); + if (StringUtils.isEmpty(str)) + { + return list; + } + + // 杩囨护绌虹櫧瀛楃涓� + if (filterBlank && StringUtils.isBlank(str)) + { + return list; + } + String[] split = str.split(sep); + for (String string : split) + { + if (filterBlank && StringUtils.isBlank(string)) + { + continue; + } + if (trim) + { + string = string.trim(); + } + list.add(string); + } + + return list; + } + + /** + * 鍒ゆ柇缁欏畾鐨剆et鍒楄〃涓槸鍚﹀寘鍚暟缁刟rray 鍒ゆ柇缁欏畾鐨勬暟缁刟rray涓槸鍚﹀寘鍚粰瀹氱殑鍏冪礌value + * + * + * @param array 缁欏畾鐨勬暟缁� + * @return boolean 缁撴灉 + */ + public static boolean containsAny(Collection<String> collection, String... array) + { + if (isEmpty(collection) || isEmpty(array)) + { + return false; + } + else + { + for (String str : array) + { + if (collection.contains(str)) + { + return true; + } + } + return false; + } + } + + /** + * 鏌ユ壘鎸囧畾瀛楃涓叉槸鍚﹀寘鍚寚瀹氬瓧绗︿覆鍒楄〃涓殑浠绘剰涓�涓瓧绗︿覆鍚屾椂涓插拷鐣ュぇ灏忓啓 + * + * @param cs 鎸囧畾瀛楃涓� + * @param searchCharSequences 闇�瑕佹鏌ョ殑瀛楃涓叉暟缁� + * @return 鏄惁鍖呭惈浠绘剰涓�涓瓧绗︿覆 + */ + public static boolean containsAnyIgnoreCase(CharSequence cs, CharSequence... searchCharSequences) + { + if (isEmpty(cs) || isEmpty(searchCharSequences)) + { + return false; + } + for (CharSequence testStr : searchCharSequences) + { + if (containsIgnoreCase(cs, testStr)) + { + return true; + } + } + return false; + } + + /** + * 椹煎嘲杞笅鍒掔嚎鍛藉悕 + */ + public static String toUnderScoreCase(String str) + { + if (str == null) + { + return null; + } + StringBuilder sb = new StringBuilder(); + // 鍓嶇疆瀛楃鏄惁澶у啓 + boolean preCharIsUpperCase = true; + // 褰撳墠瀛楃鏄惁澶у啓 + boolean curreCharIsUpperCase = true; + // 涓嬩竴瀛楃鏄惁澶у啓 + boolean nexteCharIsUpperCase = true; + for (int i = 0; i < str.length(); i++) + { + char c = str.charAt(i); + if (i > 0) + { + preCharIsUpperCase = Character.isUpperCase(str.charAt(i - 1)); + } + else + { + preCharIsUpperCase = false; + } + + curreCharIsUpperCase = Character.isUpperCase(c); + + if (i < (str.length() - 1)) + { + nexteCharIsUpperCase = Character.isUpperCase(str.charAt(i + 1)); + } + + if (preCharIsUpperCase && curreCharIsUpperCase && !nexteCharIsUpperCase) + { + sb.append(SEPARATOR); + } + else if ((i != 0 && !preCharIsUpperCase) && curreCharIsUpperCase) + { + sb.append(SEPARATOR); + } + sb.append(Character.toLowerCase(c)); + } + + return sb.toString(); + } + + /** + * 鏄惁鍖呭惈瀛楃涓� + * + * @param str 楠岃瘉瀛楃涓� + * @param strs 瀛楃涓茬粍 + * @return 鍖呭惈杩斿洖true + */ + public static boolean inStringIgnoreCase(String str, String... strs) + { + if (str != null && strs != null) + { + for (String s : strs) + { + if (str.equalsIgnoreCase(trim(s))) + { + return true; + } + } + } + return false; + } + + /** + * 灏嗕笅鍒掔嚎澶у啓鏂瑰紡鍛藉悕鐨勫瓧绗︿覆杞崲涓洪┘宄板紡銆傚鏋滆浆鎹㈠墠鐨勪笅鍒掔嚎澶у啓鏂瑰紡鍛藉悕鐨勫瓧绗︿覆涓虹┖锛屽垯杩斿洖绌哄瓧绗︿覆銆� 渚嬪锛欻ELLO_WORLD->HelloWorld + * + * @param name 杞崲鍓嶇殑涓嬪垝绾垮ぇ鍐欐柟寮忓懡鍚嶇殑瀛楃涓� + * @return 杞崲鍚庣殑椹煎嘲寮忓懡鍚嶇殑瀛楃涓� + */ + public static String convertToCamelCase(String name) + { + StringBuilder result = new StringBuilder(); + // 蹇�熸鏌� + if (name == null || name.isEmpty()) + { + // 娌″繀瑕佽浆鎹� + return ""; + } + else if (!name.contains("_")) + { + // 涓嶅惈涓嬪垝绾匡紝浠呭皢棣栧瓧姣嶅ぇ鍐� + return name.substring(0, 1).toUpperCase() + name.substring(1); + } + // 鐢ㄤ笅鍒掔嚎灏嗗師濮嬪瓧绗︿覆鍒嗗壊 + String[] camels = name.split("_"); + for (String camel : camels) + { + // 璺宠繃鍘熷瀛楃涓蹭腑寮�澶淬�佺粨灏剧殑涓嬫崲绾挎垨鍙岄噸涓嬪垝绾� + if (camel.isEmpty()) + { + continue; + } + // 棣栧瓧姣嶅ぇ鍐� + result.append(camel.substring(0, 1).toUpperCase()); + result.append(camel.substring(1).toLowerCase()); + } + return result.toString(); + } + + /** + * 椹煎嘲寮忓懡鍚嶆硶 渚嬪锛歶ser_name->userName + */ + public static String toCamelCase(String s) + { + if (s == null) + { + return null; + } + s = s.toLowerCase(); + StringBuilder sb = new StringBuilder(s.length()); + boolean upperCase = false; + for (int i = 0; i < s.length(); i++) + { + char c = s.charAt(i); + + if (c == SEPARATOR) + { + upperCase = true; + } + else if (upperCase) + { + sb.append(Character.toUpperCase(c)); + upperCase = false; + } + else + { + sb.append(c); + } + } + return sb.toString(); + } + + /** + * 鏌ユ壘鎸囧畾瀛楃涓叉槸鍚﹀尮閰嶆寚瀹氬瓧绗︿覆鍒楄〃涓殑浠绘剰涓�涓瓧绗︿覆 + * + * @param str 鎸囧畾瀛楃涓� + * @param strs 闇�瑕佹鏌ョ殑瀛楃涓叉暟缁� + * @return 鏄惁鍖归厤 + */ + public static boolean matches(String str, List<String> strs) + { + if (isEmpty(str) || isEmpty(strs)) + { + return false; + } + for (String pattern : strs) + { + if (isMatch(pattern, str)) + { + return true; + } + } + return false; + } + + /** + * 鍒ゆ柇url鏄惁涓庤鍒欓厤缃�: + * ? 琛ㄧず鍗曚釜瀛楃; + * * 琛ㄧず涓�灞傝矾寰勫唴鐨勪换鎰忓瓧绗︿覆锛屼笉鍙法灞傜骇; + * ** 琛ㄧず浠绘剰灞傝矾寰�; + * + * @param pattern 鍖归厤瑙勫垯 + * @param url 闇�瑕佸尮閰嶇殑url + * @return + */ + public static boolean isMatch(String pattern, String url) + { + AntPathMatcher matcher = new AntPathMatcher(); + return matcher.match(pattern, url); + } + + @SuppressWarnings("unchecked") + public static <T> T cast(Object obj) + { + return (T) obj; + } + + /** + * 鏁板瓧宸﹁竟琛ラ綈0锛屼娇涔嬭揪鍒版寚瀹氶暱搴︺�傛敞鎰忥紝濡傛灉鏁板瓧杞崲涓哄瓧绗︿覆鍚庯紝闀垮害澶т簬size锛屽垯鍙繚鐣� 鏈�鍚巗ize涓瓧绗︺�� + * + * @param num 鏁板瓧瀵硅薄 + * @param size 瀛楃涓叉寚瀹氶暱搴� + * @return 杩斿洖鏁板瓧鐨勫瓧绗︿覆鏍煎紡锛岃瀛楃涓蹭负鎸囧畾闀垮害銆� + */ + public static final String padl(final Number num, final int size) + { + return padl(num.toString(), size, '0'); + } + + /** + * 瀛楃涓插乏琛ラ綈銆傚鏋滃師濮嬪瓧绗︿覆s闀垮害澶т簬size锛屽垯鍙繚鐣欐渶鍚巗ize涓瓧绗︺�� + * + * @param s 鍘熷瀛楃涓� + * @param size 瀛楃涓叉寚瀹氶暱搴� + * @param c 鐢ㄤ簬琛ラ綈鐨勫瓧绗� + * @return 杩斿洖鎸囧畾闀垮害鐨勫瓧绗︿覆锛岀敱鍘熷瓧绗︿覆宸﹁ˉ榻愭垨鎴彇寰楀埌銆� + */ + public static final String padl(final String s, final int size, final char c) + { + final StringBuilder sb = new StringBuilder(size); + if (s != null) + { + final int len = s.length(); + if (s.length() <= size) + { + for (int i = size - len; i > 0; i--) + { + sb.append(c); + } + sb.append(s); + } + else + { + return s.substring(len - size, len); + } + } + else + { + for (int i = size; i > 0; i--) + { + sb.append(c); + } + } + return sb.toString(); + } +} \ No newline at end of file diff --git a/src/main/java/com/ard/utils/spring/SpringUtils.java b/src/main/java/com/ard/utils/spring/SpringUtils.java new file mode 100644 index 0000000..a71757e --- /dev/null +++ b/src/main/java/com/ard/utils/spring/SpringUtils.java @@ -0,0 +1,158 @@ +package com.ard.utils.spring; + +import com.ard.utils.other.StringUtils; +import org.springframework.aop.framework.AopContext; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.NoSuchBeanDefinitionException; +import org.springframework.beans.factory.config.BeanFactoryPostProcessor; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.stereotype.Component; + +/** + * spring宸ュ叿绫� 鏂逛究鍦ㄩ潪spring绠$悊鐜涓幏鍙朾ean + * + * @author ruoyi + */ +@Component +public final class SpringUtils implements BeanFactoryPostProcessor, ApplicationContextAware +{ + /** Spring搴旂敤涓婁笅鏂囩幆澧� */ + private static ConfigurableListableBeanFactory beanFactory; + + private static ApplicationContext applicationContext; + + @Override + public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException + { + SpringUtils.beanFactory = beanFactory; + } + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException + { + SpringUtils.applicationContext = applicationContext; + } + + /** + * 鑾峰彇瀵硅薄 + * + * @param name + * @return Object 涓�涓互鎵�缁欏悕瀛楁敞鍐岀殑bean鐨勫疄渚� + * @throws BeansException + * + */ + @SuppressWarnings("unchecked") + public static <T> T getBean(String name) throws BeansException + { + return (T) beanFactory.getBean(name); + } + + /** + * 鑾峰彇绫诲瀷涓簉equiredType鐨勫璞� + * + * @param clz + * @return + * @throws BeansException + * + */ + public static <T> T getBean(Class<T> clz) throws BeansException + { + T result = (T) beanFactory.getBean(clz); + return result; + } + + /** + * 濡傛灉BeanFactory鍖呭惈涓�涓笌鎵�缁欏悕绉板尮閰嶇殑bean瀹氫箟锛屽垯杩斿洖true + * + * @param name + * @return boolean + */ + public static boolean containsBean(String name) + { + return beanFactory.containsBean(name); + } + + /** + * 鍒ゆ柇浠ョ粰瀹氬悕瀛楁敞鍐岀殑bean瀹氫箟鏄竴涓猻ingleton杩樻槸涓�涓猵rototype銆� 濡傛灉涓庣粰瀹氬悕瀛楃浉搴旂殑bean瀹氫箟娌℃湁琚壘鍒帮紝灏嗕細鎶涘嚭涓�涓紓甯革紙NoSuchBeanDefinitionException锛� + * + * @param name + * @return boolean + * @throws NoSuchBeanDefinitionException + * + */ + public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException + { + return beanFactory.isSingleton(name); + } + + /** + * @param name + * @return Class 娉ㄥ唽瀵硅薄鐨勭被鍨� + * @throws NoSuchBeanDefinitionException + * + */ + public static Class<?> getType(String name) throws NoSuchBeanDefinitionException + { + return beanFactory.getType(name); + } + + /** + * 濡傛灉缁欏畾鐨刡ean鍚嶅瓧鍦╞ean瀹氫箟涓湁鍒悕锛屽垯杩斿洖杩欎簺鍒悕 + * + * @param name + * @return + * @throws NoSuchBeanDefinitionException + * + */ + public static String[] getAliases(String name) throws NoSuchBeanDefinitionException + { + return beanFactory.getAliases(name); + } + + /** + * 鑾峰彇aop浠g悊瀵硅薄 + * + * @param invoker + * @return + */ + @SuppressWarnings("unchecked") + public static <T> T getAopProxy(T invoker) + { + return (T) AopContext.currentProxy(); + } + + /** + * 鑾峰彇褰撳墠鐨勭幆澧冮厤缃紝鏃犻厤缃繑鍥瀗ull + * + * @return 褰撳墠鐨勭幆澧冮厤缃� + */ + public static String[] getActiveProfiles() + { + return applicationContext.getEnvironment().getActiveProfiles(); + } + + /** + * 鑾峰彇褰撳墠鐨勭幆澧冮厤缃紝褰撴湁澶氫釜鐜閰嶇疆鏃讹紝鍙幏鍙栫涓�涓� + * + * @return 褰撳墠鐨勭幆澧冮厤缃� + */ + public static String getActiveProfile() + { + final String[] activeProfiles = getActiveProfiles(); + return StringUtils.isNotEmpty(activeProfiles) ? activeProfiles[0] : null; + } + + /** + * 鑾峰彇閰嶇疆鏂囦欢涓殑鍊� + * + * @param key 閰嶇疆鏂囦欢鐨刱ey + * @return 褰撳墠鐨勯厤缃枃浠剁殑鍊� + * + */ + public static String getRequiredProperty(String key) + { + return applicationContext.getEnvironment().getRequiredProperty(key); + } +} diff --git a/src/main/java/com/ard/utils/udp/NettyUdpHandler.java b/src/main/java/com/ard/utils/udp/NettyUdpHandler.java index c3bb951..5e2160b 100644 --- a/src/main/java/com/ard/utils/udp/NettyUdpHandler.java +++ b/src/main/java/com/ard/utils/udp/NettyUdpHandler.java @@ -1,7 +1,7 @@ package com.ard.utils.udp; import com.ard.alarm.tube.service.TubeAlarmService; -import com.ard.utils.other.SpringTool; +import com.ard.utils.spring.SpringUtils; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import io.netty.channel.ChannelHandlerContext; @@ -20,7 +20,7 @@ ByteBuf byteBuf = packet.content(); String str = byteBuf.toString(Charset.forName("GBK")); log.info("udp鏀跺埌鏁版嵁: " + str); - TubeAlarmService tubeAlarmService = (TubeAlarmService) SpringTool.getApplicationContext().getBean("tubeAlarmService"); + TubeAlarmService tubeAlarmService = SpringUtils.getBean(TubeAlarmService.class); tubeAlarmService.alarmHandler(str); String resStr = "ok"; byte[] resBytes = resStr.getBytes(Charset.forName("GBK")); diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml new file mode 100644 index 0000000..bbc7292 --- /dev/null +++ b/src/main/resources/application-dev.yml @@ -0,0 +1,70 @@ +# 寮�鍙戠幆澧� +server: + port: 8088 +# spring閰嶇疆 +spring: + servlet: + multipart: + enabled: true + max-file-size: 30MB + max-request-size: 30MB + datasource: + # 浣跨敤druid鏁版嵁搴撹繛鎺ユ睜 + druid: + #寮�鍚痙ruid鐩戞帶web + stat-view-servlet: + enabled: true + driver-class-name: org.postgresql.Driver + url: jdbc:postgresql://192.168.1.15:5432/ry-vue?stringtype=unspecified + username: postgres + password: postgres + #鏈�澶ц繛鎺ユ暟 + maxActive: 30 + #鏈�灏忚繛鎺ユ暟 + minIdle: 5 + #鑾峰彇杩炴帴鐨勬渶澶х瓑寰呮椂闂� + maxWait: 10000 + #瑙e喅mysql8灏忔椂鐨勯棶棰� + validation-query: SELECT 'X' + #绌洪棽杩炴帴鐨勬鏌ユ椂闂撮棿闅� + timeBetweenEvictionRunsMillis: 60000 + #绌洪棽杩炴帴鏈�灏忕┖闂叉椂闂� + minEvictableIdleTimeMillis: 300000 + # netty閰嶇疆 + netty: + udp: + port: 40000 + enabled: true + tcp: + enabled: true + # mqtt閰嶇疆 + mqtt: + host: tcp://192.168.1.15:1883 + clientId: cc3 + username: admin + password: xzx12345 + topic: tube + timeout: 100 + keepalive: 60 + enabled: true + # 鐩楃數鎺ュ彛鍦板潃 + stealelec: + url: http://iot.zhdk.net:8090/Warning/GetWarning?userName=cy4oil + # minio閰嶇疆 + minio: + endpoint: http://192.168.1.15:9001 + accessKey: admin + secretKey: xzx12345 +# mybatis閰嶇疆 +mybatis: + typeAliasesPackage: com.ard.alarm.**.domain + mapperLocations: classpath:/mapper/*.xml +# 鏃ュ織绛夌骇閰嶇疆 +logging: + level: + hikSdk: debug + mqtt: info + netty: info + external: info + camera: info + tube: info diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml new file mode 100644 index 0000000..c74b5f0 --- /dev/null +++ b/src/main/resources/application-prod.yml @@ -0,0 +1,67 @@ +#鐢熶骇鐜 +spring: + servlet: + multipart: + enabled: true + max-file-size: 30MB + max-request-size: 30MB + datasource: + # 浣跨敤druid鏁版嵁搴撹繛鎺ユ睜 + druid: + #寮�鍚痙ruid鐩戞帶web + stat-view-servlet: + enabled: true + driver-class-name: org.postgresql.Driver + url: jdbc:postgresql://112.98.126.2:35432/ry-vue?stringtype=unspecified + username: postgres + password: Yykj.2017 + #鏈�澶ц繛鎺ユ暟 + maxActive: 30 + #鏈�灏忚繛鎺ユ暟 + minIdle: 5 + #鑾峰彇杩炴帴鐨勬渶澶х瓑寰呮椂闂� + maxWait: 10000 + #瑙e喅mysql8灏忔椂鐨勯棶棰� + validation-query: SELECT 'X' + #绌洪棽杩炴帴鐨勬鏌ユ椂闂撮棿闅� + timeBetweenEvictionRunsMillis: 60000 + #绌洪棽杩炴帴鏈�灏忕┖闂叉椂闂� + minEvictableIdleTimeMillis: 300000 + # netty閰嶇疆 + netty: + udp: + port: 40000 + enabled: true + tcp: + enabled: true + # minio閰嶇疆 + minio: + endpoint: http://127.0.0.1:9001 + accessKey: admin + secretKey: xzx12345 + # mqtt閰嶇疆 + mqtt: + host: tcp://192.168.1.15:1883 + clientId: cc3 + username: admin + password: xzx12345 + topic: tube + timeout: 100 + keepalive: 60 + enabled: true + stealelec: + url: http://iot.zhdk.net:8090/Warning/GetWarning?userName=cy4oil +mybatis: + typeAliasesPackage: com.ard.alarm.**.domain + mapperLocations: classpath:/mapper/*.xml + +server: + port: 8088 +logging: + level: + hikSdk: debug + mqtt: info + netty: info + external: info + camera: info + tube: info diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index a2f5e97..fadf7d2 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -1,61 +1,4 @@ spring: - servlet: - multipart: - enabled: true - max-file-size: 30MB - max-request-size: 30MB - datasource: - # 浣跨敤druid鏁版嵁搴撹繛鎺ユ睜 - druid: - #寮�鍚痙ruid鐩戞帶web - stat-view-servlet: - enabled: true - driver-class-name: org.postgresql.Driver - # url: jdbc:postgresql://111.40.46.199:15432/ry-vue?stringtype=unspecified - # username: postgres - # password: Yykj.2021 - url: jdbc:postgresql://192.168.1.15:5432/ry-vue?stringtype=unspecified - username: postgres - password: postgres - #鏈�澶ц繛鎺ユ暟 - maxActive: 30 - #鏈�灏忚繛鎺ユ暟 - minIdle: 5 - #鑾峰彇杩炴帴鐨勬渶澶х瓑寰呮椂闂� - maxWait: 10000 - #瑙e喅mysql8灏忔椂鐨勯棶棰� - validation-query: SELECT 'X' - #绌洪棽杩炴帴鐨勬鏌ユ椂闂撮棿闅� - timeBetweenEvictionRunsMillis: 60000 - #绌洪棽杩炴帴鏈�灏忕┖闂叉椂闂� - minEvictableIdleTimeMillis: 300000 - netty: - udp: - port: 40000 - enabled: true - tcp: - enabled: true - mqtt: - host: tcp://192.168.1.15:1883 - clientId: cc3 - username: admin - password: xzx12345 - topic: tube - timeout: 100 - keepalive: 60 - enabled: true - stealelec: - url: http://iot.zhdk.net:8090/Warning/GetWarning?userName=cy4oil -mybatis: - typeAliasesPackage: com.ard.alarm.**.domain - mapperLocations: classpath:/mapper/*.xml -# minio閰嶇疆 -minio: - endpoint: http://192.168.1.15:9001 - accessKey: admin - secretKey: xzx12345 -server: - port: 8088 -logging: - level: - com.ard.utils.hiksdk.service.impl.FMSGCallBack: debug + profiles: + active: prod + -- Gitblit v1.9.3