springboot快速整合腾讯云COS对象存储

1、导入相关依赖

<!--腾讯云COS--><dependency><groupId>com.tencentcloudapi</groupId><artifactId>tencentcloud-sdk-java</artifactId><version>3.0.1</version></dependency><dependency><groupId>com.qcloud</groupId><artifactId>cos_api</artifactId><version>5.6.8</version></dependency>

2、编写配置类,获取配置信息

创建配置类主要需要以下信息

腾讯云账号秘钥密码秘钥:用于创建COSClient链接对象,识别用户身份信息

存储桶区域:需要设置客户端所属区域Region

存储桶名称:创建请求时,需要告知上传到哪个存储桶下

存储桶访问路径:用于拼装上传文件完整访问路径

我获得的信息均写在配置类中,这里使用 @Value 或者 @ConfigurationProperties 都可以,写法就不多说,但是注意 @ConfigurationProperties 支持松散绑定,在识别读取配置信息时,不区分大小写,且会去掉中划线-、下划线_ (A-b_Obj→abobj→abObj),参考:SpringBoot松散绑定(宽松绑定)@ConfigurationProperties

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.region.Region;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;/*** @author phf* @description @ConfigurationProperties 松散绑定(中划线-、下划线_ 都去掉,且不区分大小写)*/
@Component
@ConfigurationProperties(prefix = "cos")
@Data
public class CosConfig {/*** 腾讯云账号秘钥*/private String secretId;/*** 密码秘钥*/private String secretKey;/*** 存储桶地区*/private String region;/*** 存储桶名称*/private String bucketName;/*** 存储桶访问路径*/private String path;/*** 初始化cos对象,配置相关配置信息*/@Beanpublic COSClient cosClient(){// 1 初始化用户身份信息(secretId, secretKey)。COSCredentials cred = new BasicCOSCredentials(this.secretId, this.secretKey);// 2 设置 bucket 的区域Region region = new Region(this.region);ClientConfig clientConfig = new ClientConfig(region);// 3 生成 cos 客户端。COSClient cosClient = new COSClient(cred, clientConfig);return cosClient;}
}

配置信息获取

(1)进入腾讯云对象存储→创建存储桶(有则跳过),获取存储桶名称、区域、存储桶访问路径

(2)获取腾讯云账号秘钥

3、编写逻辑层——实现上传

我这里用了多文件上传,单文件上传,把数组和循环去掉即可

public interface ICosFileService {/*** 上传* @param files* @return*/RestApiResponse<String> upload(MultipartFile[] files);/*** 删除* @param fileName* @return*/RestApiResponse<Void> delete(String fileName);
}
@Slf4j
@Service
public class ICosFileServiceImpl implements ICosFileService {@Resourceprivate COSClient cosClient;@Resourceprivate CosConfig cosConfig;@Override@Transactional(rollbackFor = Exception.class)public RestApiResponse<String> upload(MultipartFile[] files) {RestApiResponse<String> response = RestApiResponse.success();String res = "";try {for (MultipartFile file : files) {String originalFileName = file.getOriginalFilename();// 获得文件流InputStream inputStream = null;inputStream = file.getInputStream();// 设置文件路径String filePath = getFilePath(originalFileName, "你的桶内文件路径abc/def/test/");// 上传文件String bucketName = cosConfig.getBucketName();ObjectMetadata objectMetadata = new ObjectMetadata();objectMetadata.setContentLength(file.getSize());objectMetadata.setContentType(file.getContentType());PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, filePath, inputStream, objectMetadata);cosClient.putObject(putObjectRequest);cosClient.setBucketAcl(bucketName, CannedAccessControlList.PublicRead);String url = cosConfig.getPath() + "/" + filePath;res += url + ",";}String paths = res.substring(0, res.length() - 1);response.setData(paths);return response;} catch (IOException e) {e.printStackTrace();} finally {cosClient.shutdown();}return RestApiResponse.fail();}@Overridepublic RestApiResponse<Void> delete(String fileName) {cosConfig.cosClient();// 文件桶内路径String filePath = getDelFilePath(fileName, "你的桶内文件路径abc/def/test/");cosClient.deleteObject(cosConfig.getBucketName(), filePath);return RestApiResponse.success();}/*** 生成文件路径* @param originalFileName 原始文件名称* @param folder 存储路径* @return*/private String getFilePath(String originalFileName, String folder) {// 获取后缀名String fileType = originalFileName.substring(originalFileName.lastIndexOf("."));// 以文件后缀来存储在存储桶中生成文件夹方便管理String filePath = folder + "/";// 去除文件后缀 替换所有特殊字符String fileStr = StrUtil.removeSuffix(originalFileName, fileType).replaceAll("[^0-9a-zA-Z\\u4e00-\\u9fa5]", "_");filePath += new DateTime().toString("yyyyMMddHHmmss") + "_" + fileStr + fileType;log.info("filePath:" + filePath);return filePath;}/*** 生成文件路径* @param originalFileName 原始文件名称* @param folder 存储路径* @return*/private String getDelFilePath(String originalFileName, String folder) {// 获取后缀名String fileType = originalFileName.substring(originalFileName.lastIndexOf("."));// 以文件后缀来存储在存储桶中生成文件夹方便管理String filePath = folder + "/";// 去除文件后缀 替换所有特殊字符String fileStr = StrUtil.removeSuffix(originalFileName, fileType).replaceAll("[^0-9a-zA-Z\\u4e00-\\u9fa5]", "_");filePath += fileStr + fileType;log.info("filePath:" + filePath);return filePath;}
}

 4、编写Controller测试

@Api(tags = "cos文件操作")
@RestController
@RequestMapping("/cos")
public class ICosFileController {@Autowiredprivate ICosFileService iCosFileService;@ApiOperation(value = "文件上传", httpMethod = "POST")@PostMapping("/upload")public RestApiResponse<String> upload(@RequestParam("files") MultipartFile[] files) {RestApiResponse<String> result = iCosFileService.upload(files);return result;}@ApiOperation(value = "文件删除", httpMethod = "POST")@PostMapping("/delete")public RestApiResponse<String> delete(@RequestParam("fileName") String fileName) {iCosFileService.delete(fileName);return RestApiResponse.success();}
}

上传成功,且返回完整信息

删除时,保证删除的文件名称参数key,为桶内文件完整路径即可,如果你的桶是app-bucket-name,文件含桶路径是app-bucket-name/file1/file2/file.png,那桶内完整路径就是file1/file2/file.png

    public RestApiResponse<Void> delete(String fileName) {cosConfig.cosClient();// 文件桶内路径String filePath = getDelFilePath(fileName, "你的桶内文件路径abc/def/test/");// 这里的第二个参数,必须是桶内的完整路径cosClient.deleteObject(cosConfig.getBucketName(), filePath);return RestApiResponse.success();}

5、问题:COSClient报错连接池已关闭

之前自主调用了cosClient.shutdown,结果第二次上传时,就抛出异常,其实它自己维护了一个线程池:对象存储 Java SDK 常见问题-SDK 文档-文档中心-腾讯云

 

6、完整代码

https://download.csdn.net/download/huofuman960209/88085303

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

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

相关文章

【矩特征】图像矩特征

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 cv2.moments() 矩特征 1. 正文 (1). 空间矩 零阶矩&#xff1a;m00一阶矩&#xff1a;m10,m01二阶矩&#xff1a;m20,m11,m02三阶矩&#xff1a;m30,m…

Python3 学习笔记 ~ 海象赋值表达式

Python 海象运算符_小嗷犬的博客-CSDN博客 myStr "abcdefghijgk"# n len(myStr) throw out exception when compling if n len(myStr) > 10 : print(f"{myStr} length: {n} is too long, expect less 10") else:print(f"{myStr} length: {n} is…

三维虚拟电子沙盘数字沙盘态势推演教程第12课

三维虚拟电子沙盘数字沙盘态势推演教程第12课 设置system.ini 如下内容 Server122.112.229.220 userGisTest Passwordchinamtouch.com 该数据库中只提供 成都市火车南站附近的数据请注意&#xff0c;104.0648,30.61658 SDK中自带了一套 导航系统&#xff0c;用的是比较详细的…

3. Spring 更简单的读取和存储对象(五大类注解 方法注解)

目录 1. 存储 Bean 对象 1.1 配置扫描路径 1.2 添加注解存储 Bean 对象 1.2.1 Controller&#xff08;控制器存储&#xff09; 1.2.2 Service&#xff08;服务存储&#xff09; 1.2.3 Repository&#xff08;仓库存储&#xff09; 1.2.4 Component&#xff08;组件存储&…

java项目之网络视频播放器(ssm+mysql+jsp)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的网络视频播放器。技术交流和部署相关看文章末尾&#xff01; 开发环境&#xff1a; 后端&#xff1a; 开发语言&#xff1a;Java 框架&a…

react经验4:动态组件

什么是动态组件&#xff1f; 在页面的一小块区域切换显示不同的组件 实现方法 1.声明示例组件 //写在component1.tsx中 const Component1()>{return (<div>组件1</div>) } //写在component2.tsx中 const Component2()>{return (<div>组件2</div…

ElementUI tabs标签页样式改造美化

今天针对ElementUI的Tabs标签页进行了样式修改&#xff0c;更改为如下图所属的样子。 在线运行地址&#xff1a;JSRUN项目-ElementUI tabs标签页样式改造 大家如果有需要可以拿来修改使用&#xff0c;下面我也简单的贴上代码&#xff0c;代码没有注释&#xff0c;很抱歉&#x…

【C++】开源:Muduo网络库配置与使用

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍Muduo网络库配置与使用。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下…

解决gopsutil/disk报 Access is denied的问题

用gopsutil/disk库编写脚本&#xff0c;下列代码执行报错Access is denied&#xff1a; stats, err : disk.IOCounters("C:")if err ! nil {fmt.Println("Error:", err)return 切换到管理员模式仍然报错&#xff0c;开始排查。 1 排查到是引用库中的这部…

TSINGSEE青犀视频安防监控视频平台EasyCVR新增密码复杂度提示

智能视频监控平台TSINGSEE青犀视频EasyCVR可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等&#xff0c;能对外分发RTSP、RTM…

anaconda安装dlib包提示python版本不匹配

事件起因 今天使用conda install -c menpo dlib来安装dlib包时&#xff0c;提示了以下信息 (photo-repaire) PS D:\Bringing-Old-Photos-Back-to-Life-master> conda install -c menpo dlib Collecting package metadata (current_repodata.json): done Solving environme…

pdf压缩到指定大小?纯压缩干货分享

在现代生活中&#xff0c;我们经常需要通过电子邮件或其他方式共享PDF文件&#xff0c;但是较大的PDF文件可能会遇到限制&#xff0c;这时候就需要将PDF文件压缩到指定大小。 很多朋友可能不知道怎么压缩PDF文件&#xff0c;我们可以首先了解下PDF文件压缩的原理&#xff0c;主…

opencv-17 脸部打码及解码

使用掩模和按位运算方式实现的对脸部打码、解码实例 代码如下&#xff1a; import cv2 import numpy as np #读取原始载体图像 lenacv2.imread("lena.png",0) #读取原始载体图像的 shape 值 r,clena.shape masknp.zeros((r,c),dtypenp.uint8) mask[220:400,250:350…

IP xfrm 命令说明1-sa

SA命令 ip xfrm state { add | update } ID [ ALGO-LIST ] [ mode MODE ] [ mark MARK [ mask MASK ] ] [ reqid REQID ] [seq SEQ ] [ replay-window SIZE ] [ replay-seq SEQ ] [ replay-oseq SEQ ] [ flag FLAG-LIST ] [ selSELECTOR ] [ LIMIT-LIST ] [ encap ENCAP ] [ co…

Java spring Aop实战

0目录 Spring AOP 1.实战 1.实战 创建工程和依赖 数据库建表 实体类 Mapper 接口 方法一 方法二 Service包 接口1&#xff1a; 实现接口 Mapper Mapper 1 Mapper 2 配置xml文件 Xml 1 Xml 2 Spring 配置文件 Mybatis配置文件 测试类 数据库结果 …

异地远程访问连接家里的群晖NAS【内网穿透】

文章目录 异地远程访问连接家里的群晖NAS【内网穿透】 异地远程访问连接家里的群晖NAS【内网穿透】 在现代企业中&#xff0c;协同办公和数据共享的作用已经受到广泛认可&#xff0c;而群晖作为小型数据处理中心&#xff0c;也已经进入很多公司&#xff0c;并成为局域网内的数…

Redis复制 (replica)

是什么 官网地址&#xff1a;Redis replication | Redis 其实就是主从复制&#xff0c;Master以写为主&#xff0c;Slave以读为主&#xff0c;当master数据变化的时候&#xff0c;自动将新的数据异步同步到其它slave数据库。 能干嘛 读写分离容灾恢复数据备份水平扩容支撑高并…

OpenCV buffer转cv::Mat

void convertBuf2Mat(void* input_ptr, vx_uint32 width, vx_uint32 height, cv::Mat& frame) { // 计算亮度通道和色度通道的大小 size_t y_size width * height; size_t uv_size y_size / 2; // 创建一个只包含亮度通道的 cv::Mat 对象 cv::Mat y_chan…

罗马数字转整数

题记&#xff1a; 罗马数字包含以下七种字符: I&#xff0c; V&#xff0c; X&#xff0c; L&#xff0c;C&#xff0c;D 和 M。 字符------------数值 I---------------->1 V--------------->5 X--------------->10 L--------------->50 C--------------->100…

听GPT 讲K8s源代码--pkg(七)

k8s项目中 pkg/kubelet/config&#xff0c;pkg/kubelet/configmap&#xff0c;pkg/kubelet/container&#xff0c;pkg/kubelet/cri 这几个目录处理与 kubelet 配置、ConfigMap、容器管理和容器运行时交互相关的功能。它们共同构成了 kubelet 的核心功能&#xff0c;使其能够在 …