腾讯COS云存储入门

腾讯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:前置准备工作

参见文档:https://cloud.tencent.com/document/api/436/7751

1️⃣ 登录到腾讯云https://cloud.tencent.com

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

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

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

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

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

二:基本使用

这里以Java为例,其他的语言见文档,其实都差不多,文档写的很详细了

https://cloud.tencent.com/document/product/436/10199

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);
        }
    }
}
相关推荐
workbuddy小能手7 天前
腾讯云ADP Agent Portal vs 自建智能体:架构选型对比
架构·云计算·腾讯云
thinking_talk8 天前
2026中国MongoDB云服务厂商能力榜:选型对比与效能评估
数据库·mongodb·腾讯云
倔强的石头1068 天前
腾讯云一键部署OpenClaw打造QQ机器人
机器人·腾讯云
EdgeOne边缘安全加速平台10 天前
EdgeOne Web 防护×AI 升级:让 AI 既参与攻击识别,也参与误报纠错
前端·人工智能·腾讯云·edgeone
2601_9618752410 天前
法考资料全套2026|客观题|主观题|资料已整理
阿里云·云计算·腾讯云·azure·七牛云存储·csdn开发云·火山引擎
佛系豪豪吖11 天前
一台 Lighthouse 撑起 AI 全栈工作流:OpenClaw + 腾讯云生态深度实战
人工智能·经验分享·云计算·腾讯云·授权网关
云服务器代理商12 天前
腾讯云香港服务器选择指南:延迟优势、配置价格与开通思路
服务器·云计算·腾讯云·腾讯云服务器·香港节点·腾讯云国际·腾讯云海外
华万通信king12 天前
腾讯云ADP Agent Portal入门:从零搭建企业级AI智能体
腾讯云·腾讯云ai代码助手·adp
翼龙云_cloud13 天前
腾讯云代理商:2026如何使用腾讯云CloudBase AI Builder 搭建个人博客?
人工智能·云计算·腾讯云·ai智能体
翼龙云_cloud13 天前
腾讯云代理商:为OpenClaw配置云开发CloudBase Skill 全自动开发上线
云计算·腾讯云·ai智能体