腾讯云~云存储和数据万象CI 实战

文章目录

            • 1. 依赖
            • 2. 工具类
            • 3. 配置文件

1. 依赖
      <!--腾讯云存储--><dependency><groupId>com.qcloud</groupId><artifactId>cos_api</artifactId><version>5.6.45</version></dependency><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.2.2</version></dependency><!--腾讯云--><dependency><groupId>com.tencentcloudapi</groupId><artifactId>tencentcloud-sdk-java</artifactId><version>3.1.416</version></dependency><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId></dependency>
2. 工具类
package com.example.emos.api.oss;import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.IdUtil;import com.example.emos.api.exception.EmosException;
import com.qcloud.cos.COSClient;
import com.qcloud.cos.ClientConfig;
import com.qcloud.cos.auth.BasicCOSCredentials;
import com.qcloud.cos.auth.COSCredentials;
import com.qcloud.cos.http.HttpMethodName;
import com.qcloud.cos.http.HttpProtocol;
import com.qcloud.cos.model.*;
import com.qcloud.cos.model.ciModel.auditing.ImageAuditingRequest;
import com.qcloud.cos.model.ciModel.auditing.ImageAuditingResponse;
import com.qcloud.cos.region.Region;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;import java.io.IOException;
import java.net.URL;
import java.util.*;/*** 腾讯云存储工具类封装(COS+数据万象)** @author gblfy* @date 2022-12-05*/
@Component
public class CosUtils {@Value("${tencent.cloud.appId}")private String appId;@Value("${tencent.cloud.secretId}")private String secretId;@Value("${tencent.cloud.secretKey}")private String secretKey;@Value("${tencent.cloud.region-public}")private String regionPublic;@Value("${tencent.cloud.bucket-public}")private String bucketPublic;@Value("${tencent.cloud.region-private}")private String regionPrivate;@Value("${tencent.cloud.bucket-private}")private String bucketPrivate;//获取访问公有存储桶的连接private COSClient getCosPublicClient() {COSCredentials cred = new BasicCOSCredentials(secretId, secretKey);ClientConfig clientConfig = new ClientConfig(new Region(regionPublic));clientConfig.setHttpProtocol(HttpProtocol.https);COSClient cosClient = new COSClient(cred, clientConfig);return cosClient;}//获得访问私有存储桶的连接private COSClient getCosPrivateClient() {COSCredentials cred = new BasicCOSCredentials(secretId, secretKey);ClientConfig clientConfig = new ClientConfig(new Region(regionPrivate));clientConfig.setHttpProtocol(HttpProtocol.https);COSClient cosClient = new COSClient(cred, clientConfig);return cosClient;}/*** 向公有存储桶上传文件(数据万象对上传图片审核)** @param file 前端上传的文件* @param path 文件上传的腾讯云存储路径(按照类型存储到不同的分类下的文件中下面)* @return* @throws IOException*/public HashMap uploadPublicFile(MultipartFile file, String path) throws IOException {String fileName = file.getOriginalFilename(); //上传文件的名字String fileType = fileName.substring(fileName.lastIndexOf(".")); //文件后缀名path += IdUtil.simpleUUID() + fileType; //避免重名图片在云端覆盖,所以用UUID作为文件名//元数据信息ObjectMetadata meta = new ObjectMetadata();meta.setContentLength(file.getSize());meta.setContentEncoding("UTF-8");meta.setContentType(file.getContentType());//向存储桶中保存文件PutObjectRequest putObjectRequest = new PutObjectRequest(bucketPublic, path, file.getInputStream(), meta);putObjectRequest.setStorageClass(StorageClass.Standard); //标准存储COSClient client = getCosPublicClient();PutObjectResult putObjectResult = client.putObject(putObjectRequest);//合成外网访问地址HashMap map = new HashMap();map.put("url", "https://" + bucketPublic + ".cos." + regionPublic + ".myqcloud.com" + path);map.put("path", path);client.shutdown();return map;}/*** 向公有存储桶上传文件(数据万象对上传图片审核)** @param file 前端上传的文件* @param path 文件上传的腾讯云存储路径(按照类型存储到不同的分类下的文件中下面)* @return* @throws IOException*/public HashMap uploadPublicFileAndCloudInfinite(MultipartFile file, String path) throws IOException {String fileName = file.getOriginalFilename(); //上传文件的名字String fileType = fileName.substring(fileName.lastIndexOf(".")); //文件后缀名path += IdUtil.simpleUUID() + fileType; //避免重名图片在云端覆盖,所以用UUID作为文件名//元数据信息ObjectMetadata meta = new ObjectMetadata();meta.setContentLength(file.getSize());meta.setContentEncoding("UTF-8");meta.setContentType(file.getContentType());//向存储桶中保存文件PutObjectRequest putObjectRequest = new PutObjectRequest(bucketPublic, path, file.getInputStream(), meta);putObjectRequest.setStorageClass(StorageClass.Standard); //标准存储COSClient client = getCosPublicClient();PutObjectResult putObjectResult = client.putObject(putObjectRequest);//合成外网访问地址HashMap map = new HashMap();map.put("url", "https://" + bucketPublic + ".cos." + regionPublic + ".myqcloud.com" + path);map.put("path", path);//如果保存的是图片,用数据万象服务对图片内容审核if (List.of(".jpg", ".jpeg", ".png", ".gif", ".bmp").contains(fileType)) {//审核图片内容ImageAuditingRequest request = new ImageAuditingRequest();request.setBucketName(bucketPublic);request.setDetectType("porn,terrorist,politics,ads"); //辨别黄色、暴利、政治和广告内容request.setObjectKey(path);ImageAuditingResponse response = client.imageAuditing(request); //执行审查if (!response.getPornInfo().getHitFlag().equals("0")|| !response.getTerroristInfo().getHitFlag().equals("0")|| !response.getAdsInfo().getHitFlag().equals("0")) {//删除违规图片client.deleteObject(bucketPublic, path);throw new EmosException("图片内容不合规");}}client.shutdown();return map;}/*** 向私有存储桶上传文件** @param file 前端上传的文件* @param path 文件上传的腾讯云存储路径(按照类型存储到不同的分类下的文件中下面)* @return* @throws IOException*/public HashMap uploadPrivateFile(MultipartFile file, String path) throws IOException {String fileName = file.getOriginalFilename(); //上传文件的名字String fileType = fileName.substring(fileName.lastIndexOf(".")); //文件后缀名path += IdUtil.simpleUUID() + fileType; //避免重名图片在云端覆盖,所以用UUID作为文件名//元数据信息ObjectMetadata meta = new ObjectMetadata();meta.setContentLength(file.getSize());meta.setContentEncoding("UTF-8");meta.setContentType(file.getContentType());//向存储桶中保存文件PutObjectRequest putObjectRequest = new PutObjectRequest(bucketPrivate, path, file.getInputStream(), meta);putObjectRequest.setStorageClass(StorageClass.Standard);COSClient client = getCosPrivateClient();PutObjectResult putObjectResult = client.putObject(putObjectRequest); //上传文件HashMap map = new HashMap();map.put("path", path);client.shutdown();return map;}/*** 向私有存储桶上传文件(数据万象对上传图片审核)** @param file 前端上传的文件* @param path 文件上传的腾讯云存储路径(按照类型存储到不同的分类下的文件中下面)* @return* @throws IOException*/public HashMap uploadPrivateFileAndCloudInfinite(MultipartFile file, String path) throws IOException {String fileName = file.getOriginalFilename(); //上传文件的名字String fileType = fileName.substring(fileName.lastIndexOf(".")); //文件后缀名path += IdUtil.simpleUUID() + fileType; //避免重名图片在云端覆盖,所以用UUID作为文件名//元数据信息ObjectMetadata meta = new ObjectMetadata();meta.setContentLength(file.getSize());meta.setContentEncoding("UTF-8");meta.setContentType(file.getContentType());//向存储桶中保存文件PutObjectRequest putObjectRequest = new PutObjectRequest(bucketPrivate, path, file.getInputStream(), meta);putObjectRequest.setStorageClass(StorageClass.Standard);COSClient client = getCosPrivateClient();PutObjectResult putObjectResult = client.putObject(putObjectRequest); //上传文件HashMap map = new HashMap();map.put("path", path);//如果保存的是图片,用数据万象服务对图片内容审核if (List.of(".jpg", ".jpeg", ".png", ".gif", ".bmp").contains(fileType)) {//审核图片内容ImageAuditingRequest request = new ImageAuditingRequest();request.setBucketName(bucketPrivate);request.setDetectType("porn,terrorist,politics,ads"); //辨别黄色、暴利、政治和广告内容request.setObjectKey(path);ImageAuditingResponse response = client.imageAuditing(request); //执行审查if (!response.getPornInfo().getHitFlag().equals("0")|| !response.getTerroristInfo().getHitFlag().equals("0")|| !response.getPoliticsInfo().getHitFlag().equals("0")|| !response.getAdsInfo().getHitFlag().equals("0")) {//删除违规图片client.deleteObject(bucketPrivate, path);throw new EmosException("图片内容不合规");}}client.shutdown();return map;}/*** 获取私有读写文件的临时URL外网访问地址** @param path* @return*/public String getPrivateFileUrl(String path) {COSClient client = getCosPrivateClient();GeneratePresignedUrlRequest request =new GeneratePresignedUrlRequest(bucketPrivate, path, HttpMethodName.GET);Date expiration = DateUtil.offsetMinute(new Date(), 5);  //设置临时URL有效期为5分钟request.setExpiration(expiration);URL url = client.generatePresignedUrl(request);client.shutdown();return url.toString();}/*** 刪除公有存储桶的文件* @param pathes*/public void deletePublicFile(String[] pathes) {COSClient client = getCosPublicClient();for (String path : pathes) {client.deleteObject(bucketPublic, path);}client.shutdown();}/*** 刪除私有存储桶的文件* @param pathes*/public void deletePrivateFile(String[] pathes) {COSClient client = getCosPrivateClient();for (String path : pathes) {client.deleteObject(bucketPrivate, path);}client.shutdown();}
}
3. 配置文件
tencent:cloud:appId: 腾讯云APPIDsecretId: 腾讯云SecretIdsecretKey: 腾讯云SecretKeyregion-public: 公有存储桶所在地域bucket-public: 公有存储桶名称region-private: 私有存储桶所在地域bucket-private: 私有存储桶名称

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/514893.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据湖有新解!Apache Hudi 与 Apache Flink 集成

简介&#xff1a; 纵观大数据领域成熟、活跃、有生命力的框架&#xff0c;无一不是设计优雅&#xff0c;能与其他框架相互融合&#xff0c;彼此借力&#xff0c;各专所长。 作者&#xff1a;王祥虎&#xff08;Apache Hudi 社区&#xff09; Apache Hudi 是由 Uber 开发并开源…

显微镜下的大明内容_平凡故事展现炮火下人性光辉,李少红《解放·终局营救》创作全解...

【巨匠】至心至情&#xff0c;匠心独运尝试过大量的题材与类型后&#xff0c;在建国70周年的历史性时刻&#xff0c;李少红老师终于执导了自己的第一部战争电影《解放终局营救》。 有人说&#xff0c;这只是李少红题材创新的一个新方向&#xff1b;有人说&#xff0c;李少红是想…

MQTT在游戏运营发行中的实践

前言 在游戏生态中&#xff0c;主要包含游戏的研发方以及运营发行方。一款游戏的运行&#xff0c;分为研发和运营两个阶段。研发的主体有个人、独立工作室、游戏研发公司等&#xff1b; 游戏的研发主体专注于游戏内容的研发&#xff0c;对游戏的发行及运营往往在人力、财力上…

2021 火爆技术人朋友圈的实时音视频 RTC 你 Pick 了嘛?

5月27日20点&#xff0c;第 13 期「大咖来了」&#xff01; CSDN 副总裁于邦旭、融云 CTO 任杰、即构科技副总裁刘莉&#xff0c;多方视角探讨 RTC 超级风口与机遇&#xff0c;还有众多精美礼品等你拿&#xff01; 立即戳&#xff1a;https://live.csdn.net/room/csdnnews/cn…

[V3] Error on build in CI: Cannot find module ‘node:path‘ in vite.config.ts

解决办法 原来的自己的 node 版本是 v14.16.0 的版本&#xff0c;出现了不兼容的问题&#xff0c;于是升级到了稳定版 v16.16.0 。 从新删除一下安装包 rm -rf node_modules package-lock.json 再 npm i&#xff0c;再 build 就没有问题了。 问题链接&#xff1a;https://gith…

SAE 的极致应用部署效率

简介&#xff1a; SAE 在应用创建、部署、重启过程中的效率优化。 作者 | 文俊 阿里巴巴云原生团队 本文整理自《Serverless 技术公开课》 作为 Serverless 平台&#xff0c;SAE 提供了应用全托管的服务&#xff0c;充分利用了云原生的技术红利&#xff0c;以容器作为应用载体…

axios 失败 安装_axios 安装使用

axios 是一个基于Promise 用于浏览器和 nodejs 的 HTTP 客户端&#xff0c;本质上也是对原生XHR的封装&#xff0c;只不过它是Promise的实现版本&#xff0c;符合最新的ES规范&#xff0c;它本身具有以下特征&#xff1a;1.从浏览器中创建 XMLHttpRequest2.支持 Promise API3.客…

独家下载!《Java工程师成神之路(基础篇)》

简介&#xff1a; 初学Java的你还在烦恼不知道怎么去学&#xff0c;学习什么内容吗&#xff1f;那么多的技术书籍是否已经让你无从下手&#xff1f;别急&#xff0c;来看这一份完整的Java学习路径。 复制该链接到浏览器完成下载或分享&#xff1a;https://developer.aliyun.com…

Gartner:2021全球安全和风险支出将超1500亿美元

编辑 | 宋 慧 作者 | Gartner投稿 头图 | 付费下载于东方IC 全球信息技术研究和顾问公司Gartner预测&#xff0c;2021年全球信息安全和风险管理技术与服务支出预计将增长12.4%&#xff0c;达到1504亿美元。2020年安全和风险管理支出增长率为6.4%。 Gartner分析师认为&#xf…

四年,如何从前端小白蜕变为前端技术专家?

作者简介&#xff1a;珑晴——淘系技术部前端技术专家&#xff0c;16 年校招实习转正进入的阿里&#xff0c;当时是在聚划算前端团队&#xff0c;随着业务变化一路从聚划算到天猫至今加入淘系技术部&#xff0c;负责日常活动营销的同时&#xff0c;也多次参与大促会场&互动…

lg显示器工厂模式怎么进入_LG液晶显示器进入工厂模式方法.doc

LG液晶显示器进入工厂模式方法常见CRT显示器的工厂模式进入方法IT.SOHU.COM  2004-05-07 09:51  转自&#xff1a; 天极网显示器工厂模式的进入方法集锦1.TCL显示器1)M1502显示器面板按键&#xff1a;“&#xff0d;”,“&#xff0b;”,“←”,“→”,电源开关“◎”。工厂模…

Tomcat 一键启停脚本 linux

文章目录一、脚本开发1. 编写脚本2. 修改脚本3. 赋予权限二、脚本执行2.1. 启动tomact2.2. 查看tomact状态2.3. 停止tomact一、脚本开发 1. 编写脚本 vim start-tomcat.sh添加以下内容&#xff1a; #!/bin/bash# description: Tomcat start/stop/status script#Location of …

从 Storm 迁移到 Flink,美团外卖实时数仓建设实践

简介&#xff1a; 本文主要介绍一种通用的实时数仓构建的方法与实践。实时数仓以端到端低延迟、SQL 标准化、快速响应变化、数据统一为目标。 作者&#xff1a;朱良 本文主要介绍一种通用的实时数仓构建的方法与实践。实时数仓以端到端低延迟、SQL 标准化、快速响应变化、数据…

Arm发布移动端v9体系新架构,CPU、GPU、IP全囊括了!

2021年5月25日晚&#xff0c;Arm发布了针对移动端的Armv9体系新架构&#xff0c;除了公布首款全面计算&#xff08;Total Compute&#xff09;解决方案&#xff0c;Arm还发布了首批基于Armv9 架构的Cortex-A CPU&#xff0c;为消费电子视觉体验而设计的Mali-G GPU系列&#xff…

阿里 双11 同款,流量防卫兵 Sentinel go 源码解读

简介&#xff1a; 本文主要分析阿里巴巴集团开源的流量控制中间件 Sentinel&#xff0c;其原生支持了 Java/Go/C 等多种语言&#xff0c;本文仅仅分析其 Go 语言实现。下文如无特殊说明&#xff0c;sentinel 指代 Sentinel-Go。 作者 | 于雨 apache/dubbo-go 项目负责人 本文…

matlab程序 地震 相干噪声_地震台站台基噪声功率谱概率密度函数Matlab实现

地震台站台基噪声功率谱概率密度函数Matlab实现谢江涛林丽萍谌亮赵敏【摘要】摘要选取2015年四川数字测震台网中筠连和华蓥山地震台记录的垂直分向连续波形数据&#xff0c;利用Matlab软件&#xff0c;计算地震台站台基噪声功率谱概率密度函数&#xff0c;分析地震台站环境噪声…

工业发展 安全护航 2021年工业互联网安全发展峰会成功召开

在数字化创新日益深入的背景下&#xff0c;工业互联网已经成为制造企业构建敏捷、弹性的基础架构的重要转型方向。但与此同时&#xff0c;安全风险与威胁向OT环境渗透&#xff0c;产生了额外的复杂性&#xff0c;对于关键业务与数据带来了严重威胁&#xff0c;构建工业互联网安…

基于 Flink + ClickHouse 打造轻量级点击流实时数仓

作者&#xff1a;LittleMagic Flink 和 ClickHouse 分别是实时计算和&#xff08;近实时&#xff09;OLAP 领域的翘楚&#xff0c;也是近些年非常火爆的开源框架&#xff0c;很多大厂都在将两者结合使用来构建各种用途的实时平台&#xff0c;效果很好。关于两者的优点就不再赘…

Spring boot 2.3优雅下线,距离生产还有多远?

简介&#xff1a; 对于任何一个线上应用&#xff0c;如何在服务更新部署过程中保证业务无感知是开发者必须要解决的问题&#xff0c;即从应用停止到重启恢复服务这个阶段不能影响正常的业务请求&#xff0c;这使得无损下线成为应用生命周期中必不可少的一个环节。 前言 在生产…

unplugin-vue-components和unplugin-auto-import 使用

文章目录1. 插件安装2. 创建配置文档链接 1. 插件安装 首先你需要安装unplugin-vue-components 和 unplu在这里插入代码片gin-auto-import这两款插件 npm install -D unplugin-vue-components unplugin-auto-import然后把下列代码插入到你的 Vite 或 Webpack 的配置文件中 …