腾讯COS云存储入门
文章目录
一:前置准备
1:涉及到的概念了解
名称 | 描述 |
---|---|
APPID | 开发者访问 COS 服务时拥有的用户维度唯一资源标识,用以标识资源,可在 API 密钥管理 页面获取。 |
SecretId | 开发者拥有的项目身份识别 ID,用于身份认证,可在 API 密钥管理 页面获取。 |
SecretKey | 开发者拥有的项目身份密钥,可在 API 密钥管理 页面获取。 |
Bucket | 存储桶,COS 中用于存储数据的容器。 |
BucketName-APPID | 存储桶名称格式,用户在使用 API、SDK 时,需要按照此格式填写存储桶名称。例如 examplebucket-1250000000,含义为该存储桶 examplebucket 归属于 APPID 为1250000000的用户。 |
Object | 对象,COS 中存储的具体文件,是存储的基本实体。 |
ObjectKey | 对象键,对象(Object)在存储桶(Bucket)中的唯一标识。 |
Region | 地域信息,枚举值可参见 可用地域 文档,例如:ap-beijing、ap-hongkong、eu-frankfurt 等。 |
ACL | 访问控制列表(Access Control List),是指特定 Bucket 或 Object 的访问控制信息列表。 |
CORS | 跨域资源共享指发起请求的资源所在域不同于该请求所指向资源所在的域的 HTTP 请求。 |
Multipart Uploads | 分块上传,腾讯云 COS 服务为上传文件提供的一种分块上传模式。 |
Object Content | Object Content 是上传文件的二进制内容。 |
2:前置准备工作
1️⃣ 登录到腾讯云[https://cloud.tencent.com]

2️⃣ 在腾讯云 对象存储控制台 开通腾讯云对象存储(COS)服务,开通就送免费的180天的,可以用于学习使用

3️⃣ 在对象存储控制台创建一个bucket


最后在确认配置这部看看配置有没有问题

4️⃣ 在API管理中创建APIkey和密码[https://console.cloud.tencent.com/cam/capi\],注意保存secretkey文件

5️⃣ 下载cosbrower[https://cloud.tencent.com/document/product/436/11366\],并通过上一步中拿到的secretID和secretkey进行登录


二:基本使用
这里以Java为例,其他的语言见文档,其实都差不多,文档写的很详细了
1:测试和准备
1️⃣ 先测试一下自己和cos服务通不通

2️⃣ 在你的项目中引入如下maven依赖
xml
<dependency>
<groupId>com.qcloud</groupId>
<artifactId>cos_api</artifactId>
<version>5.6.227</version>
</dependency>
2:具体开发说明
2.1:初始化客户端
分为使用临时的秘钥(安全,需要使用工具生成)和永久秘钥(可能有暴露的风险,一定要最小权限指引)
由于是学习部分,这里直接使用永久秘钥进行演示,临时秘钥生成简单介绍
临时秘钥的获取(https://cloud.tencent.com/document/product/1312/48195)
2.2:完整入门demo
java
package com.example.demo;
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.exception.CosClientException;
import com.qcloud.cos.http.HttpProtocol;
import com.qcloud.cos.model.*;
import com.qcloud.cos.region.Region;
import lombok.extern.slf4j.Slf4j;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
@Slf4j
public class CosTest {
public static void main(String[] args) {
String bucketName = "cuihaida-1258741528";
String key = "folder/222.png";
COSClient cosClient = CosTest.getCosClient();
CosTest.getBucketList(cosClient);
CosTest.uploadFile(cosClient, bucketName, key, "/Users/cuihaida/project/java/first/demo/src/main/java/com/example/demo/111.png");
CosTest.getBucketList(cosClient);
// CosTest.deleteObject(cosClient, bucketName, key);
CosTest.downLoadObject(cosClient, bucketName, key, "333.png");
}
/**
* 获取 COS 客户端
* @return COSClient
*/
public static COSClient getCosClient() {
// 1 初始化用户身份信息(secretId, secretKey)。
// SECRETID 和 SECRETKEY 请登录访问管理控制台 https://console.cloud.tencent.com/cam/capi 进行查看和管理
String secretId = "AKI...."; //用户的 SecretId,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参见 https://cloud.tencent.com/document/product/598/37140
String secretKey = "....";//用户的 SecretKey,建议使用子账号密钥,授权遵循最小权限指引,降低使用风险。子账号密钥获取可参见 https://cloud.tencent.com/document/product/598/37140
COSCredentials cred = new BasicCOSCredentials(secretId, secretKey);
// 2 设置 bucket 的地域, COS 地域的简称请参见 https://cloud.tencent.com/document/product/436/6224
// ap-beijing, ap-hangzhou...
// clientConfig 中包含了设置 region, https(默认 http), 超时, 代理等 set 方法, 使用可参见源码或者常见问题 Java SDK 部分。
Region region = new Region("ap-beijing");
ClientConfig clientConfig = new ClientConfig(region);
// 这里建议设置使用 https 协议
// 从 5.6.54 版本开始,默认使用了 https
clientConfig.setHttpProtocol(HttpProtocol.https);
// 3 生成 cos 客户端。
return new COSClient(cred, clientConfig);
}
/**
* 创建存储桶
* @param cosClient cos 客户端
* @param bucketName 存储桶名称
*/
public static void createBucket(COSClient cosClient, String bucketName) {
CreateBucketRequest createBucketRequest = new CreateBucketRequest(bucketName);
// 设置 bucket 的权限为 Private(私有读写)、其他可选有 PublicRead(公有读私有写)、PublicReadWrite(公有读写)
createBucketRequest.setCannedAcl(CannedAccessControlList.Private);
try{
Bucket bucketResult = cosClient.createBucket(createBucketRequest);
log.info("创建存储桶成功: {}", bucketResult.getName());
} catch (CosClientException clientException) {
log.error("创建存储桶失败: {}", clientException.getMessage());
}
}
/**
* 获取存储桶列表
*
* @param cosClient cos 客户端
*/
public static void getBucketList(COSClient cosClient) {
try {
List<Bucket> buckets = cosClient.listBuckets();
for (Bucket bucket : buckets) {
log.info(" - {}\t{}\t{}\t{}\t{}\t{}",
bucket.getName(),
bucket.getLocation(),
bucket.getCreationDate(),
bucket.getOwner().getDisplayName(),
bucket.getOwner().getId(),
bucket.getBucketType());
}
} catch (CosClientException clientException) {
log.error("获取存储桶列表失败: {}", clientException.getMessage());
}
}
/**
* 上传文件
* @param cosClient cos 客户端
* @param bucketName 存储桶名称
* @param key 文件名称
* @param localFilePath 本地文件路径
*/
public static void uploadFile(COSClient cosClient, String bucketName, String key, String localFilePath) {
File localFile = new File(localFilePath);
try {
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key, localFile);
PutObjectResult putObjectResult = cosClient.putObject(putObjectRequest);
log.info("上传文件成功: {}", putObjectResult);
} catch (CosClientException clientException) {
log.error("上传文件失败: {}", clientException.getMessage());
}
}
/**
* 获取文件列表
* @param cosClient cos 客户端
* @param bucketName 存储桶名称
* @param prefix 表示列出的 object 的 key 以 prefix 开始
* @param delimiter 表示分隔符, 设置为/表示列出当前目录下的 object, 设置为空表示列出所有的 object
* @param maxKeyNumber 最多列举多少个对象, 一次 listobject 最大支持1000
* @return 文件列表
*/
public static List<ObjectListing> getObjectList(COSClient cosClient, String bucketName, String prefix, String delimiter, int maxKeyNumber) {
// 设置ListObjectsRequest
ListObjectsRequest listObjectsRequest = new ListObjectsRequest();
listObjectsRequest.setBucketName(bucketName);
listObjectsRequest.setPrefix(prefix);
listObjectsRequest.setDelimiter(delimiter);
listObjectsRequest.setMaxKeys(maxKeyNumber);
ObjectListing objectListing = null;
List<ObjectListing> objectListingList = new ArrayList<>();
do {
try {
objectListing = cosClient.listObjects(listObjectsRequest);
getInfoOfFileListString(objectListing);
objectListingList.add(objectListing);
} catch (CosClientException clientException) {
log.error("获取文件列表失败: {}", clientException.getMessage());
}
} while (Objects.requireNonNull(objectListing).isTruncated());
return objectListingList;
}
/**
* 下载文件
* @param cosClient cos 客户端
* @param bucketName 存储桶名称
* @param key 文件名称
* @param localFilePath 本地文件路径
* @return 文件元数据
*/
public static ObjectMetadata downLoadObject(COSClient cosClient, String bucketName, String key, String localFilePath) {
try {
// 创建 GetObjectRequest
GetObjectRequest getObjectRequest = new GetObjectRequest(bucketName, key);
// 下载文件
ObjectMetadata objectMetadata = cosClient.getObject(getObjectRequest, new File(localFilePath));
log.info("下载文件成功: {}", objectMetadata);
return objectMetadata;
} catch (CosClientException clientException) {
log.error("下载文件失败: {}", clientException.getMessage());
return null;
}
}
/**
* 删除文件
* @param cosClient cos 客户端
* @param bucketName 存储桶名称
* @param key 文件名称
*/
public static void deleteObject(COSClient cosClient, String bucketName, String key) {
try {
cosClient.deleteObject(bucketName, key);
log.info("删除文件成功: {}", key);
} catch (CosClientException clientException) {
log.error("删除文件失败: {}", clientException.getMessage());
}
}
/**
* 获取文件列表信息
* @param objectListing 文件列表
*/
private static void getInfoOfFileListString(ObjectListing objectListing) {
// common prefix 表示被 delimiter 截断的路径, 如 delimter 设置为/, common prefix 则表示所有子目录的路径
List<String> commonPrefixs = objectListing.getCommonPrefixes();
for (String commonPrefix : commonPrefixs) {
log.info(" - commonPrefix: {}", commonPrefix);
}
// object summary 表示所有列出的 object 列表
List<COSObjectSummary> cosObjectSummaries = objectListing.getObjectSummaries();
for (COSObjectSummary cosObjectSummary : cosObjectSummaries) {
// 文件的路径 key
String key = cosObjectSummary.getKey();
// 文件的 etag
String etag = cosObjectSummary.getETag();
// 文件的长度
long fileSize = cosObjectSummary.getSize();
// 文件的存储类型
String storageClasses = cosObjectSummary.getStorageClass();
log.info(" - key: {} etag: {} size: {} storageClass: {}", key, etag, fileSize, storageClasses);
}
}
}
