diff --git a/adc-da-main/src/main/resources/application-dev.properties b/adc-da-main/src/main/resources/application-dev.properties index 7898e80..b53670e 100644 --- a/adc-da-main/src/main/resources/application-dev.properties +++ b/adc-da-main/src/main/resources/application-dev.properties @@ -114,6 +114,8 @@ spring.redis.jedis.pool.max-wait=2000ms spring.redis.database=6 +# 上传方式:阿里云:alioss 华为云:hwobs +uploadType: hwobs # ======= 阿里OSS配置 ========= aliyun.OSS.endpoint=https://oss-cn-hangzhou.aliyuncs.com @@ -122,6 +124,13 @@ aliyun.OSS.accessKeySecret= mY6UvWv20Tg2R46ORe6uV5gL6TQloC aliyun.OSS.bucketName=qqxexamplebucket aliyun.OSS.fileMaxSize=10 #文件上传最大M数 +# ======= 华为OBS配置 ========= +huawei.OBS.endPoint=https://obs.cn-north-4.myhuaweicloud.com +huawei.OBS.accessKey=EEMAGYTHP9KKPF18TZCL +huawei.OBS.secretKey=3NmFNf1uX3EV1LbCEzgw6gDv0tZ6WAVwG37BGq1p +huawei.OBS.bucketName=gcpa +huawei.OBS.fileMaxSize=10 #文件上传最大M数 + logging.level.com.adc: debug diff --git a/adc-da-report/pom.xml b/adc-da-report/pom.xml index 277a48d..acde4b8 100644 --- a/adc-da-report/pom.xml +++ b/adc-da-report/pom.xml @@ -19,6 +19,12 @@ aliyun-sdk-oss 3.10.2 + + + com.huaweicloud + esdk-obs-java-bundle + [3.21.11,) + org.springframework.boot spring-boot-starter-web diff --git a/adc-da-report/src/main/java/com/adc/da/report/config/ObsConfig.java b/adc-da-report/src/main/java/com/adc/da/report/config/ObsConfig.java new file mode 100644 index 0000000..dc87635 --- /dev/null +++ b/adc-da-report/src/main/java/com/adc/da/report/config/ObsConfig.java @@ -0,0 +1,31 @@ +package com.adc.da.report.config; + +import com.adc.da.report.util.ObsBootUtil; +import lombok.Data; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Data +@Configuration +@ConfigurationProperties(prefix = "huawei.obs") +public class ObsConfig { + /** + * 访问密钥AK + */ + private String accessKey; + /** + * 访问密钥SK + */ + private String secretKey; + /** + * 终端节点 + */ + private String endPoint; + /** + * 桶 + */ + private String bucketName; + +} diff --git a/adc-da-report/src/main/java/com/adc/da/report/controller/ReportManageConroller.java b/adc-da-report/src/main/java/com/adc/da/report/controller/ReportManageConroller.java index 9442f8c..73a3be2 100644 --- a/adc-da-report/src/main/java/com/adc/da/report/controller/ReportManageConroller.java +++ b/adc-da-report/src/main/java/com/adc/da/report/controller/ReportManageConroller.java @@ -6,6 +6,7 @@ import com.adc.da.report.eo.ReportEntity; import com.adc.da.report.service.IFileService; import com.adc.da.report.service.IReportService; import com.adc.da.report.util.OSSClientUtil; +import com.adc.da.report.util.ObsBootUtil; import com.adc.da.report.vo.ReportQueryVo; import com.adc.da.report.vo.ReportVo; import com.adc.da.util.http.ResponseMessage; @@ -17,6 +18,8 @@ import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import javax.annotation.Resource; + +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.web.bind.annotation.*; @@ -57,6 +60,12 @@ public class ReportManageConroller { @Resource private OSSClientUtil ossClientUtil; + @Autowired + private ObsBootUtil obsBootUtil; + + @Value("${uploadType}") + private String uploadType; + /** * 新增或编辑报告 @@ -173,8 +182,13 @@ public class ReportManageConroller { fileName = fileName.substring(0, fileName.lastIndexOf("."))+date + num + "." + ext; log.info("fileName>>" + fileName); try{ - String result=ossClientUtil.uploadFile2OSS(file.getInputStream(),fileName); - + String result=""; + // 上传方式:阿里云:alioss 华为云:hwobs + if (uploadType.equals("hwobs")){ + result = obsBootUtil.upload(file, fileName); + }else if (uploadType.equals("alioss")){ + result = ossClientUtil.uploadFile2OSS(file.getInputStream(),fileName); + } resultMap.put("key", date + num); resultMap.put("value", path + "//" + fileName); resultMap.put("name", realName); @@ -284,7 +298,12 @@ public class ReportManageConroller { response.setHeader("Content-Disposition", "attachment;filename=" + filename); response.setContentType("application/x-download"); // File file = new File(uploadFile, entity.getSavePath()); - ossClientUtil.downloadFileFromOSS(entity.getSavePath(),response); + // 上传方式:阿里云:alioss 华为云:hwobs + if (uploadType.equals("hwobs")){ + obsBootUtil.downFile(entity.getSavePath(), response); + }else if (uploadType.equals("alioss")){ + ossClientUtil.downloadFileFromOSS(entity.getSavePath(),response); + } } catch (Exception ex) { log.info(ex.getMessage(),ex); diff --git a/adc-da-report/src/main/java/com/adc/da/report/util/ObsBootUtil.java b/adc-da-report/src/main/java/com/adc/da/report/util/ObsBootUtil.java new file mode 100644 index 0000000..9bd57d8 --- /dev/null +++ b/adc-da-report/src/main/java/com/adc/da/report/util/ObsBootUtil.java @@ -0,0 +1,120 @@ +package com.adc.da.report.util; + +import com.adc.da.login.util.CommonUtils; +import com.adc.da.report.config.ObsConfig; +import com.adc.da.util.exception.AdcDaBaseException; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +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.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.PostConstruct; +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.util.Objects; +import java.util.logging.Logger; + +/** + * @Description: 华为云 obs 上传工具类(高依赖版) + * @Date: 2019/5/10 + */ +@Slf4j +@Component +public class ObsBootUtil { + + @Autowired + private ObsConfig obsConfig; + private static ObsConfig configProperties; + private static ObsClient obsClient; + + @PostConstruct + public void init() { + configProperties = this.obsConfig; + obsClient = new ObsClient(configProperties.getAccessKey(), configProperties.getSecretKey(), configProperties.getEndPoint()); + } + /** + * 上传文件至华为云 OBS + * @author YJZ + * @Date 2022/11/11 16:35 + * @param file 文件 + * @param fileName 文件名称 包括后缀名 + * @return + */ + public String upload(MultipartFile file, String fileName) { + obsClient = new ObsClient(configProperties.getAccessKey(), configProperties.getSecretKey(), configProperties.getEndPoint()); + PutObjectResult result = null; + try { + InputStream inputStream = file.getInputStream(); + // 判断桶是否存在 + String bucketName = configProperties.getBucketName(); + boolean exists = obsClient.headBucket(bucketName); + if(!exists){ + // 若不存在,则创建桶 + HeaderResponse response = obsClient.createBucket(bucketName); + log.info("创建桶成功" + response.getRequestId()); + } + ObjectMetadata metadata = new ObjectMetadata(); + metadata.setContentType(file.getContentType()); + metadata.setContentLength((long) inputStream.available()); + result = obsClient.putObject(bucketName, fileName, inputStream, metadata); + } catch (ObsException | IOException oe) { + throw new AdcDaBaseException("OBS上传失败"); + } finally { + destroy(obsClient); + } + return result.getRequestId(); + } + + //下载文件 + public void downFile(String objectKey, HttpServletResponse response) throws IOException { + obsClient = new ObsClient(configProperties.getAccessKey(), configProperties.getSecretKey(), configProperties.getEndPoint()); + InputStream objectContent = null; + try { + ObsObject obsObject = obsClient.getObject(configProperties.getBucketName(), objectKey); + objectContent = obsObject.getObjectContent(); + if (!Objects.isNull(objectContent)){ + byte[] bt = new byte[1024 * 1024]; + int len = 0; + while ((len = objectContent.read(bt)) != -1) { + response.getOutputStream().write(bt, 0, len); + } + } + }catch (ObsException | IOException oe){ + throw new AdcDaBaseException("OBS下载文件失败"); + }finally { + // 数据读取完成后,获取的流必须关闭,否则会造成连接泄漏,导致请求无连接可用,程序无法正常工作。 + objectContent.close(); + response.getOutputStream().close(); + } + + } + + //文件删除 + public void deleteFile(String objectKey) { + obsClient.deleteObject(configProperties.getBucketName(), objectKey); + } + + /** + * 销毁OBS客户端实例 + * @author LQT + * @Date 2022/10/25 13:40 + * @param obsClient + * @return void + */ + public void destroy(ObsClient obsClient){ + try { + obsClient.close(); + } catch (ObsException e) { + log.error("obs执行失败", e); + } catch (Exception e) { + log.error("执行失败", e); + } + } + +}