From 3b93f977e7de346cc1b99dfe6c0f1fc948291a90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A2=81=E7=90=A6=E6=B6=9B?= Date: Wed, 10 Jul 2024 15:12:45 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=8D=8E=E4=B8=BA=E4=BA=91ob?= =?UTF-8?q?s=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- laws-base/laws-base-core/pom.xml | 8 +- .../jero/common/constant/CommonConstant.java | 3 +- .../com/jero/common/util/CommonUtils.java | 5 +- .../com/jero/common/util/obs/ObsBootUtil.java | 225 ++++++++++++++++++ .../com/jero/config/oss/ObsConfiguration.java | 51 ++++ .../system/controller/CommonController.java | 17 ++ .../activiti/enums/ProcessTypeEnum.java | 3 +- .../process/common/enums/ProcessType.java | 3 +- .../ProcessNewStandardImportController.java | 2 +- .../sys/controller/SysCommonController.java | 25 +- .../src/main/resources/application-dev.yml | 10 +- 11 files changed, 343 insertions(+), 9 deletions(-) create mode 100644 laws-base/laws-base-core/src/main/java/com/jero/common/util/obs/ObsBootUtil.java create mode 100644 laws-base/laws-base-core/src/main/java/com/jero/config/oss/ObsConfiguration.java diff --git a/laws-base/laws-base-core/pom.xml b/laws-base/laws-base-core/pom.xml index 69cbfcd6..bf7091f5 100644 --- a/laws-base/laws-base-core/pom.xml +++ b/laws-base/laws-base-core/pom.xml @@ -265,6 +265,12 @@ org.springframework spring-test + + + com.huaweicloud + esdk-obs-java-bundle + [3.21.11,) + - \ No newline at end of file + diff --git a/laws-base/laws-base-core/src/main/java/com/jero/common/constant/CommonConstant.java b/laws-base/laws-base-core/src/main/java/com/jero/common/constant/CommonConstant.java index ce7f1105..2d682bd4 100644 --- a/laws-base/laws-base-core/src/main/java/com/jero/common/constant/CommonConstant.java +++ b/laws-base/laws-base-core/src/main/java/com/jero/common/constant/CommonConstant.java @@ -209,11 +209,12 @@ public class CommonConstant { public static final String ONLINE_PARAM_VAL_IS_FALSE = "N"; /** - * 文件上传类型(本地:local,Minio:minio,阿里云:alioss) + * 文件上传类型(本地:local,Minio:minio,阿里云:alioss, 华为云: hwobs) */ public static final String UPLOAD_TYPE_LOCAL = "local"; public static final String UPLOAD_TYPE_MINIO = "minio"; public static final String UPLOAD_TYPE_OSS = "alioss"; + public static final String UPLOAD_TYPE_OBS = "hwobs"; /** * 文档上传自定义桶名称 diff --git a/laws-base/laws-base-core/src/main/java/com/jero/common/util/CommonUtils.java b/laws-base/laws-base-core/src/main/java/com/jero/common/util/CommonUtils.java index cd3185eb..284ad847 100644 --- a/laws-base/laws-base-core/src/main/java/com/jero/common/util/CommonUtils.java +++ b/laws-base/laws-base-core/src/main/java/com/jero/common/util/CommonUtils.java @@ -18,6 +18,7 @@ import com.jero.common.constant.CommonConstant; import com.jero.common.constant.DataBaseConstant; import com.jero.common.exception.JeroBootException; import com.jero.common.util.filter.FileTypeFilter; +import com.jero.common.util.obs.ObsBootUtil; import com.jero.common.util.oss.OssBootUtil; import org.jeecgframework.poi.util.PoiPublicUtil; import org.springframework.util.FileCopyUtils; @@ -115,8 +116,10 @@ public class CommonUtils { String url = ""; if (CommonConstant.UPLOAD_TYPE_MINIO.equals(uploadType)) { url = MinioUtil.upload(file, bizPath); - } else { + } else if(CommonConstant.UPLOAD_TYPE_OSS.equals(uploadType)){ url = OssBootUtil.upload(file, bizPath); + } else if(CommonConstant.UPLOAD_TYPE_OBS.equals(uploadType)){ + url = ObsBootUtil.upload(file,bizPath); } return url; } diff --git a/laws-base/laws-base-core/src/main/java/com/jero/common/util/obs/ObsBootUtil.java b/laws-base/laws-base-core/src/main/java/com/jero/common/util/obs/ObsBootUtil.java new file mode 100644 index 00000000..a04d7183 --- /dev/null +++ b/laws-base/laws-base-core/src/main/java/com/jero/common/util/obs/ObsBootUtil.java @@ -0,0 +1,225 @@ +package com.jero.common.util.obs; + +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import com.jero.common.exception.JeroBootException; +import com.jero.common.util.CommonUtils; +import com.obs.services.ObsClient; +import com.obs.services.exception.ObsException; +import com.obs.services.model.*; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.io.FileUtils; +import org.springframework.web.multipart.MultipartFile; + +import java.io.*; + +/** + * @Description: 华为云 obs 上传工具类(高依赖版) + * @Date: 2019/5/10 + */ +@Slf4j +public class ObsBootUtil { + + private static String endPoint; + + private static String accessKeyId; + + private static String accessKeySecret; + + private static String bucketName; + + public static void setEndPoint(String endPoint) { + ObsBootUtil.endPoint = endPoint; + } + + public static void setAccessKeyId(String accessKeyId) { + ObsBootUtil.accessKeyId = accessKeyId; + } + + public static void setAccessKeySecret(String accessKeySecret) { + ObsBootUtil.accessKeySecret = accessKeySecret; + } + + public static void setBucketName(String bucketName) { + ObsBootUtil.bucketName = bucketName; + } + public static String getEndPoint() { + return endPoint; + } + + public static String getAccessKeyId() { + return accessKeyId; + } + + public static String getAccessKeySecret() { + return accessKeySecret; + } + + public static String getBucketName() { + return bucketName; + } + + /** + * 上传文件至华为云 OBS + * @author LQT + * @Date 2022/10/25 13:42 + * @param uploadFile 待上传文件 + * @param objectKey 文件路径 + * @return java.lang.String + */ + public static String upload(MultipartFile uploadFile, String objectKey) { + ObsClient obsClient = null; + try { + obsClient = initOSS(endPoint, accessKeyId, accessKeySecret); + // 判断桶是否存在 + boolean exists = obsClient.headBucket(bucketName); + if(!exists){ + // 若不存在,则创建桶 + HeaderResponse response = obsClient.createBucket(bucketName); + log.info("创建桶成功" + response.getRequestId()); + } + // 获取文件名 + String orgName = uploadFile.getOriginalFilename(); + orgName = CommonUtils.getFileName(orgName); + if(orgName.indexOf(".")!=-1){ + orgName = orgName.substring(0, orgName.lastIndexOf(".")) + "_" + System.currentTimeMillis() + orgName.substring(orgName.indexOf(".")); + }else{ + orgName = orgName+ "_" + System.currentTimeMillis(); + } + String savePath = orgName; + if(!StringUtils.isBlank(objectKey)){ + savePath = objectKey + File.separator + orgName; + } + + + InputStream inputStream = uploadFile.getInputStream(); + long available = inputStream.available(); + PutObjectRequest request = new PutObjectRequest(bucketName,savePath,inputStream); + + ObjectMetadata objectMetadata = new ObjectMetadata(); + objectMetadata.setContentLength(available); + request.setMetadata(objectMetadata); + // 设置对象访问权限为公共读 + request.setAcl(AccessControlList.REST_CANNED_PUBLIC_READ); + PutObjectResult result = obsClient.putObject(request); + + // 读取该已上传对象的URL + log.info("已上传对象的URL" + result.getObjectUrl()); + return savePath; + } catch (Exception e) { + log.error("文件上传失败", e); + throw new JeroBootException("文件上传失败"); + } finally { + destroy(obsClient); + } + } + + /** + * 上传文件到OBS + * @author LQT + * @Date 2022/10/25 13:41 + * @param stream + * @param objectKey 原始文件名称 + * @return java.lang.String + */ + public static String upload(InputStream stream, String objectKey) { + ObsClient obsClient = null; + try { + obsClient = initOSS(endPoint, accessKeyId, accessKeySecret); + // 判断桶是否存在 + boolean exists = obsClient.headBucket(bucketName); + if(!exists){ + // 若不存在,则创建桶 + HeaderResponse response = obsClient.createBucket(bucketName); + log.info("创建桶成功" + response.getRequestId()); + } + long available = stream.available(); + PutObjectRequest request = new PutObjectRequest(bucketName,objectKey,stream); + + ObjectMetadata objectMetadata = new ObjectMetadata(); + objectMetadata.setContentLength(available); + request.setMetadata(objectMetadata); + // 设置对象访问权限为公共读 + request.setAcl(AccessControlList.REST_CANNED_PUBLIC_READ); + PutObjectResult result = obsClient.putObject(request); + + // 读取该已上传对象的URL + log.info("已上传对象的URL" + result.getObjectUrl()); + return result.getObjectUrl(); + } catch (Exception e) { + log.error("文件上传失败", e); + throw new JeroBootException("文件上传失败"); + } finally { + destroy(obsClient); + } + } + + /** + * 获取文件流 + * @author LQT + * @Date 2022/10/25 13:41 + * @param objectName 文件名 + * @return java.io.InputStream + */ + public static InputStream getOssFile(String objectName){ + InputStream inputStream = null; + ObsClient obsClient = null; + try{ + obsClient = initOSS(endPoint, accessKeyId, accessKeySecret); + ObsObject obsObject = obsClient.getObject(bucketName,objectName); + inputStream = new BufferedInputStream(obsObject.getObjectContent()); + }catch (Exception e){ + log.error("文件下载失败", e); + throw new JeroBootException("文件下载失败"); + }finally { + destroy(obsClient); + } + return inputStream; + } + + /** + * 初始化 oss 客户端 + * @author LQT + * @Date 2022/10/25 13:41 + * @param endpoint + * @param accessKeyId + * @param accessKeySecret + * @return void + */ + private static ObsClient initOSS(String endpoint, String accessKeyId, String accessKeySecret) { + ObsClient obsClient = new ObsClient(accessKeyId, accessKeySecret, endpoint); + return obsClient; + } + + /** + * 销毁OBS客户端实例 + * @author LQT + * @Date 2022/10/25 13:40 + * @param obsClient + * @return void + */ + public static void destroy(ObsClient obsClient){ + try { + obsClient.close(); + } catch (ObsException e) { + log.error("obs执行失败", e); + } catch (Exception e) { + log.error("执行失败", e); + } + } + + /** + * 将InputStream写入本地文件 + */ + public static void writeToLocal(String path, InputStream input) + throws IOException { + int index; + byte[] bytes = new byte[1024]; + FileOutputStream downloadFile = FileUtils.openOutputStream(new File(path)); + while ((index = input.read(bytes)) != -1) { + downloadFile.write(bytes, 0, index); + downloadFile.flush(); + } + downloadFile.close(); + input.close(); + } +} diff --git a/laws-base/laws-base-core/src/main/java/com/jero/config/oss/ObsConfiguration.java b/laws-base/laws-base-core/src/main/java/com/jero/config/oss/ObsConfiguration.java new file mode 100644 index 00000000..c01b1d02 --- /dev/null +++ b/laws-base/laws-base-core/src/main/java/com/jero/config/oss/ObsConfiguration.java @@ -0,0 +1,51 @@ +package com.jero.config.oss; + +import com.jero.common.util.obs.ObsBootUtil; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * @ClassName HweiOBSConfig + * @Description 华为云OBS配置类 + * @Author lqt + * @Date 2022/10/24 10:43 + * @Version 1.0 + */ +@Slf4j +@Configuration +public class ObsConfiguration { + /** + * 访问密钥AK + */ + @Value("${jero.obs.accessKey}") + private String accessKey; + + /** + * 访问密钥SK + */ + @Value("${jero.obs.secretKey}") + private String securityKey; + + /** + * 终端节点 + */ + @Value("${jero.obs.endPoint}") + private String endPoint; + + /** + * 桶 + */ + @Value("${jero.obs.bucketName}") + private String bucketName; + + @Bean + public void initObsBootConfiguration() { + ObsBootUtil.setEndPoint(endPoint); + ObsBootUtil.setAccessKeyId(accessKey); + ObsBootUtil.setAccessKeySecret(securityKey); + ObsBootUtil.setBucketName(bucketName); + } +} diff --git a/laws-module-system/src/main/java/com/jero/modules/system/controller/CommonController.java b/laws-module-system/src/main/java/com/jero/modules/system/controller/CommonController.java index 8d236114..9d16fa09 100644 --- a/laws-module-system/src/main/java/com/jero/modules/system/controller/CommonController.java +++ b/laws-module-system/src/main/java/com/jero/modules/system/controller/CommonController.java @@ -10,6 +10,7 @@ import com.jero.common.constant.CommonConstant; import com.jero.common.exception.JeroBootException; import com.jero.common.system.api.ISysBaseAPI; import com.jero.common.util.*; +import com.jero.common.util.obs.ObsBootUtil; import com.jero.modules.oss.entity.OSSFile; import com.jero.modules.oss.service.IOSSFileService; import com.jero.modules.system.util.SysWaterMarkUtil; @@ -207,6 +208,22 @@ public class CommonController { response.setStatus(404); e.printStackTrace(); } + }else if(CommonConstant.UPLOAD_TYPE_OBS.equals(uploadType)) { + // 华为云 下载 + try (InputStream inputStream = ObsBootUtil.getOssFile(fileUrl); + OutputStream outputStream = response.getOutputStream() + ) { + byte[] buf = new byte[1024]; + int len; + while ((len = inputStream.read(buf)) > 0) { + outputStream.write(buf, 0, len); + } + response.flushBuffer(); + } catch (Exception e) { + log.error(FILE_VIEW_ERROR + e.getMessage()); + response.setStatus(404); + e.printStackTrace(); + } } } diff --git a/laws-modules/src/main/java/com/jero/modules/activiti/enums/ProcessTypeEnum.java b/laws-modules/src/main/java/com/jero/modules/activiti/enums/ProcessTypeEnum.java index 41d5ea47..19fac3e8 100644 --- a/laws-modules/src/main/java/com/jero/modules/activiti/enums/ProcessTypeEnum.java +++ b/laws-modules/src/main/java/com/jero/modules/activiti/enums/ProcessTypeEnum.java @@ -11,9 +11,10 @@ import lombok.Getter; @AllArgsConstructor public enum ProcessTypeEnum { DEMO("测试流程", 0, "com.jero.modules.activiti.process.demo.service.ProcessDemoService", "/workCenter/StandardEntryOrChangeProcess", "/workCenter/StandardEntryOrChangeProcess"), + NEW_STANDARD_IMPORT("新法规导入流程", 1, "com.jero.modules.activiti.process.ni.service.ProcessNewStandardImportService", "/workCenter/ProcessNewStandardImportProcess", "/workCenter/StandardComplianceCheckProcess"), STANDARD_INTERPRET("标准解读流程", 2, "com.jero.modules.activiti.process.standardinterpret.service.impl.StandardInterpretFlow", "", ""), STANDARD_COMPLIANCE_CHECK("法规符合性排查流程", 3, "com.jero.modules.activiti.process.standardComplianceCheck.service.ProcessStandardComplianceCheckService", "/workCenter/StandardComplianceCheckProcess", "/workCenter/StandardComplianceCheckProcess"), - NEW_STANDARD_IMPORT("新法规导入流程", 4, "com.jero.modules.activiti.process.ni.service.ProcessNewStandardImportService", "/workCenter/ProcessNewStandardImportProcess", "/workCenter/StandardComplianceCheckProcess"), + MARKET_STANDARD_PUBLISH("市场清单发布流程", 4, "com.jero.modules.activiti.process.ni.service.ProcessNewStandardImportService", "/workCenter/ProcessNewStandardImportProcess", "/workCenter/StandardComplianceCheckProcess"), ; private final String name; diff --git a/laws-modules/src/main/java/com/jero/modules/activiti/process/common/enums/ProcessType.java b/laws-modules/src/main/java/com/jero/modules/activiti/process/common/enums/ProcessType.java index 0832497a..633d08d0 100644 --- a/laws-modules/src/main/java/com/jero/modules/activiti/process/common/enums/ProcessType.java +++ b/laws-modules/src/main/java/com/jero/modules/activiti/process/common/enums/ProcessType.java @@ -11,9 +11,10 @@ import lombok.Getter; @Getter public enum ProcessType { + NEW_STANDARD_IMPORT("新法规导入流程", "1", "new_standard_import", "ProcessNewStandardImportServiceImpl"), STANDARD_INTERPRET("标准解读流程", "2", "standard_interpret", "StandardInterpretFlowServiceImpl"), STANDARD_COMPLIANCE_CHECK("法规符合性评估流程", "3", "laws-evaluation-main", "ProcessStandardComplianceCheckServiceImpl"), - NEW_STANDARD_IMPORT("新法规搭导入流程", "4", "new_standard_import", "ProcessNewStandardImportServiceImpl"), + MARKET_STANDARD_PUBLISH("市场清单发布流程", "4", "market_standard_publish", "ProcessNewStandardImportServiceImpl"), ; private final String name; diff --git a/laws-modules/src/main/java/com/jero/modules/activiti/process/ni/controller/ProcessNewStandardImportController.java b/laws-modules/src/main/java/com/jero/modules/activiti/process/ni/controller/ProcessNewStandardImportController.java index 0b52220a..ff58a249 100644 --- a/laws-modules/src/main/java/com/jero/modules/activiti/process/ni/controller/ProcessNewStandardImportController.java +++ b/laws-modules/src/main/java/com/jero/modules/activiti/process/ni/controller/ProcessNewStandardImportController.java @@ -96,7 +96,7 @@ public class ProcessNewStandardImportController extends JeroController handle(@PathVariable("taskId") String taskId) { - ProcessDraft draft = actFlowCommonService.getExistDraftByTaskId(taskId, ProcessTypeEnum.STANDARD_COMPLIANCE_CHECK); + ProcessDraft draft = actFlowCommonService.getExistDraftByTaskId(taskId, ProcessTypeEnum.NEW_STANDARD_IMPORT); if (draft != null) { return Result.OK(draft); } diff --git a/laws-modules/src/main/java/com/jero/modules/sys/controller/SysCommonController.java b/laws-modules/src/main/java/com/jero/modules/sys/controller/SysCommonController.java index 8dd7fcdd..b152b96e 100644 --- a/laws-modules/src/main/java/com/jero/modules/sys/controller/SysCommonController.java +++ b/laws-modules/src/main/java/com/jero/modules/sys/controller/SysCommonController.java @@ -3,9 +3,11 @@ package com.jero.modules.sys.controller; import cn.hutool.core.io.FileUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.jero.common.constant.CommonConstant; import com.jero.common.exception.JeroBootException; import com.jero.common.util.IntekeyUtils; import com.jero.common.util.MinioUtil; +import com.jero.common.util.obs.ObsBootUtil; import com.jero.modules.laws.enterprise.service.EnterpriseStandardAuthUserService; import com.jero.modules.laws.standard.entity.LawsEnterpriseStandard; import com.jero.modules.laws.standard.service.ILawsEnterpriseStandardService; @@ -15,6 +17,7 @@ import com.jero.modules.system.util.SysWaterMarkUtil; import com.jero.modules.system.util.UserUtils; import lombok.extern.slf4j.Slf4j; import org.apache.http.entity.ContentType; +import org.springframework.beans.factory.annotation.Value; import org.springframework.core.io.ClassPathResource; import org.springframework.mock.web.MockMultipartFile; import org.springframework.web.bind.annotation.GetMapping; @@ -52,6 +55,10 @@ public class SysCommonController { @Resource private EnterpriseStandardAuthUserService authUserService; + @Value(value = "${jero.uploadType}") + private String uploadType; + + private static final String FILE_VIEW_ERROR = "预览文件失败"; /** * 下载文件 @@ -178,7 +185,7 @@ public class SysCommonController { e.printStackTrace(); } } - } else { + } else if (CommonConstant.UPLOAD_TYPE_MINIO.equals(uploadType)) { try (InputStream inputStream = MinioUtil.getMinioFile(MinioUtil.getBucketName(), url); OutputStream outputStream = response.getOutputStream() ) { @@ -195,6 +202,22 @@ public class SysCommonController { log.error(e.getMessage()); response.setStatus(404); } + }else if(CommonConstant.UPLOAD_TYPE_OBS.equals(uploadType)) { + // 华为云 下载 + try (InputStream inputStream = ObsBootUtil.getOssFile(fileUrl); + OutputStream outputStream = response.getOutputStream() + ) { + byte[] buf = new byte[1024]; + int len; + while ((len = inputStream.read(buf)) > 0) { + outputStream.write(buf, 0, len); + } + response.flushBuffer(); + } catch (Exception e) { + log.error(FILE_VIEW_ERROR + e.getMessage()); + response.setStatus(404); + e.printStackTrace(); + } } } diff --git a/laws-single-startup/src/main/resources/application-dev.yml b/laws-single-startup/src/main/resources/application-dev.yml index 6cd2448a..19c31e3e 100644 --- a/laws-single-startup/src/main/resources/application-dev.yml +++ b/laws-single-startup/src/main/resources/application-dev.yml @@ -234,6 +234,12 @@ jero: secretKey: ?? bucketName: jeroos staticDomain: jerodev + #华为云obs存储配置 + obs: + endPoint: https://obsv3.wh-yd-01.mychery.com + accessKey: 1NENLYHKWGCHNTKCBTWJ + secretKey: wnLuaLGfyIw2HQGCNGepyA3Oob0TwUhIN15Vodlu + bucketName: # ElasticSearch 6设置 elasticsearch: username: grp @@ -547,6 +553,6 @@ OCR: # 系统内置角色 sys_role: # 法规管理员 - laws_admin: admin + laws_admin: regulationAdmin # 超级管理员 - super_admin: KFGLY + super_admin: superAdmin