1.腾讯云cos介绍
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景
2.JavaSDK方式使用
1.引入依赖
使用maven在pom.xml引入依赖
<!-- 腾讯云cos-->
<dependency>
<groupId>com.qcloud</groupId>
<artifactId>cos_api</artifactId>
</dependency>
2.编写配置文件
将配置项写在application.yml中,再由spring注入到常量类中,具体配置内容查看腾讯云cos控制台和产品文档
qclound:
cos:
file:
#腾讯云cos的id
secretId: xxxxxxxxxxxxxxxx
#腾讯云cos的密码
secretKey: xxxxxxxxxxxxxxxxxxxxxxxx
#腾讯云cos的地域
region: ap-chengdu
#腾讯云储存桶的名字
bucket: guli-college-1258905932
3.创建 COSClient 实例,这个实例用来后续调用请求
代码来自腾讯云cos的javaJDK示例文档
/**
* 1.创建 COSClient 实例,这个实例用来后续调用请求
*
* @return COSClient实例
*/
private COSClient createCOSClient() {
// 设置用户身份信息。
// SECRETID 和 SECRETKEY 请登录访问管理控制台 https://console.cloud.tencent.com/cam/capi 进行查看和管理
String secretId = ConstandPropertiesUtils.SECRET_ID;
String secretKey = ConstandPropertiesUtils.SECRET_KEY;
COSCredentials cred = new BasicCOSCredentials(secretId, secretKey);
// ClientConfig 中包含了后续请求 COS 的客户端设置:
ClientConfig clientConfig = new ClientConfig();
// 设置 bucket 的地域
// COS_REGION 请参照 https://cloud.tencent.com/document/product/436/6224
clientConfig.setRegion(new Region(ConstandPropertiesUtils.REGION));
// 设置请求协议, http 或者 https
// 5.6.53 及更低的版本,建议设置使用 https 协议
// 5.6.54 及更高版本,默认使用了 https
clientConfig.setHttpProtocol(HttpProtocol.https);
// 以下的设置,是可选的:
// 设置 socket 读取超时,默认 30s
clientConfig.setSocketTimeout(30 * 1000);
// 设置建立连接超时,默认 30s
clientConfig.setConnectionTimeout(30 * 1000);
// 如果需要的话,设置 http 代理,ip 以及 port
// clientConfig.setHttpProxyIp("httpProxyIp");
// clientConfig.setHttpProxyPort(80);
// 生成 cos 客户端。
return new COSClient(cred, clientConfig);
}
4.上传文件至COS
这里是小文件上传,大文件推荐使用流的方式,MultipartFile类型是前端接口传入的类型
/**
* 2.流式上传文件到腾讯云cos,代码不需要写,复制他的示例修改就好
*
* @param file
* @return 文件的上传路径
*/
@Override
public String uploadAvatar(MultipartFile file) {
// 调用 COS 接口之前必须保证本进程存在一个 COSClient 实例,如果没有则创建
// 详细代码参见本页:简单操作 -> 创建 COSClient
COSClient cosClient = createCOSClient();
// 存储桶的命名格式为 BucketName-APPID,此处填写的存储桶名称必须为此格式
String bucketName = ConstandPropertiesUtils.BUCKET_NAME;
// 对象键(Key)是对象在存储桶中的唯一标识,这里设置为文件名+UUID
String uuid = UUID.randomUUID().toString().replaceAll("-", "");
String key = uuid + file.getOriginalFilename();
//获取当前日期,用于把上传的文件按照日期分类,cos会自动创建对应的文件夹
String date = new DateTime().toString("yyyy/MM/dd");
key = date + "/" + key;
// 2022/03/24/03c15e03e30d49dcb0a57f77d075899enewYear.jpg
System.out.println(key);
//这里应该是您要上传的 InputStream 类型的流
InputStream inputStream = null;
try {
inputStream = file.getInputStream();
} catch (IOException e) {
e.printStackTrace();
}
ObjectMetadata objectMetadata = new ObjectMetadata();
// 上传的流如果能够获取准确的流长度,则推荐一定填写 content-length
// 如果确实没办法获取到,则下面这行可以省略,但同时高级接口也没办法使用分块上传了
// objectMetadata.setContentLength(inputStreamLength);
//上传,args:储存桶名,对象键,文件流
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key, inputStream, objectMetadata);
String url = null;
try {
PutObjectResult putObjectResult = cosClient.putObject(putObjectRequest);
//使用腾讯云的api获得对象key的路径
url = cosClient.getObjectUrl(bucketName, key).toString();
System.out.println(putObjectResult.getRequestId());
} catch (CosClientException e) {
e.printStackTrace();
} finally {
cosClient.shutdown();
}
return url;
}
5.删除COS中指定文件
url通过前端返回
//上传成功回调,返回图片地址,这里的data是ImageCropper帮我们上传之后封装返回的
cropSuccess(data) {
console.log(data)
this.close()
this.teacher.avatar = data.url
},
//删除已经上传到cos的头像文件
removeAvatar() {
let index =this.teacher.avatar.lastIndexOf('/')
let photoName= this.teacher.avatar.substring(index+1)
//当没有点击最后的保存按钮并且图片名不为默认图片时执行删除,以免误删除
if (this.isDetermineSave === false && photoName!=="default.png") {
eduTeacher.removeAvatar(this.teacher.avatar)
}
}
/**
* 删除COS中的文件
* @param url
* @return
*/
@Override
public Boolean deleteAvatar(String url) {
if (StringUtils.isNullOrEmpty(url)) {
return false;
}
// 调用 COS 接口之前必须保证本进程存在一个 COSClient 实例,如果没有则创建
COSClient cosClient = createCOSClient();
// 存储桶的命名格式为 BucketName-APPID,此处填写的存储桶名称必须为此格式
String bucketName = ConstandPropertiesUtils.BUCKET_NAME;
// "https://guli-college-1258905932.cos.ap-chengdu.myqcloud.com/2022/03/24/69d5e43fd2444d978d114bb1136b6f45file.png"
int index = url.indexOf("myqcloud.com/");
//因为myqcloud.com/长13,要从它后面开始截取
String key = url.substring(index + 13);
log.info("要删除的对象名:" + key);
try {
cosClient.deleteObject(bucketName, key);
cosClient.shutdown();
return true;
} catch (CosClientException e) {
e.printStackTrace();
} finally {
// 确认本进程不再使用 cosClient 实例之后,关闭之
cosClient.shutdown();
}
return false;
}