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…

三维虚拟电子沙盘数字沙盘态势推演教程第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…

ElementUI tabs标签页样式改造美化

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

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

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

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

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

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…

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数据库。 能干嘛 读写分离容灾恢复数据备份水平扩容支撑高并…

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

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

JAVA解析EXCEL(JExcelAPI,POI,EasyExcel)

前言 文章目录 前言JExcelAPIDemo POIHSSFWorkBookXSSFWorkBookDemo SXSSFWorkBookDemo XSSFReaderDemo EasyExcelDemo demo代码&#xff1a;https://github.com/RwTo/excel-demo JAVA解析Excel 一般有三种方式 JExcelAPI POI EasyExcel JExcelAPI 官网&#xff1a;https://je…

Vben Admin学习笔记

Modal 弹窗 modal弹窗一般作为单文件组件被引用&#xff0c;下面是两段示例代码&#xff1a; 弹窗文件 Modal.vue // Modal.vue <template><BasicModal v-bind"$attrs" title"Modal Title" :helpMessage"[提示1, 提示2]">Modal I…

【PostgreSQL内核学习(九)—— 查询执行(数据定义语句执行)】

数据定义语句执行 概述数据定义语句执行流程执行示例 声明&#xff1a;本文的部分内容参考了他人的文章。在编写过程中&#xff0c;我们尊重他人的知识产权和学术成果&#xff0c;力求遵循合理使用原则&#xff0c;并在适用的情况下注明引用来源。 本文主要参考了《PostgresSQL…

ES6 模块编程(新思路方便复习笔记)

文章目录 ES6 模块编程(新思路方便复习笔记)介绍需求说明思路分析/图解代码实现创建common.js创建use_common.js 其它导出形式--直接导出创建common2.js创建use_common2.js 其它导出形式--默认导出创建common3.js创建use_common3.js--导入默认导出模块/数据注意事项和使用细节导…

【应用】Asible自动化运维工具的应用与常用命令

ansible自动化运维工具 一、ansible 的概述1. ansible 的概念2. ansible 的特性 二、ansible 的部署与命令1. ansible 的部署1.1 服务器ip地址设置1.2 ansible 服务器部署 2. ansible 命令行模块2.1 command 模块2.2 shell 模块2.3 cron 模块2.4 user 模块2.5 group 模块2.6 co…

中国农业大学计算机考研分析

关注我们的微信公众号 姚哥计算机考研 更多详情欢迎咨询 中国农业大学&#xff08;B-&#xff09;考研难度&#xff08;☆☆☆&#xff09; 中国农业大学计算机考研招生学院是信息与电气工程学院。目前均已出拟录取名单。 中国农业大学信息与电气工程学院&#xff0c;起源于…

使用EasyPoi实现Excel的按模板样式导出

1&#xff0c;横向遍历 #fe 使用#fe命令可以实现集合数据的横向拓展&#xff0c;比如模板代码是 {{#fe:maths t.score}}导出的excel里面就会显示会自当前列&#xff0c;向右拓展&#xff0c;效果可参见下面的导出文件截图 2&#xff0c;横向遍历值 v_fe 使用v_fe命令可以实现…