腾讯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️⃣ 下载cosbrower[https://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);
        }
    }
}
相关推荐
熊猫钓鱼>_>9 小时前
腾讯云EdgeOne Pages深度使用指南
javascript·云计算·腾讯云
EasyCVR1 天前
视频汇聚系统EasyCVR调用设备录像保活时视频流不连贯问题解决方案
数据库·ubuntu·音视频·云存储·云端录像
熊猫钓鱼>_>3 天前
腾讯云EdgeOne产品深度分析报告
云计算·腾讯云
Clownseven3 天前
阿里云OSS vs 腾讯云COS深度对比:如何为网站静态资源选择最佳对象存储?
阿里云·云计算·腾讯云
Clownseven4 天前
云市场周报 (2025.08.06):腾讯云开学季、阿里云OSS降价及市场格局分析
阿里云·云计算·腾讯云
记得开心一点嘛4 天前
实名认证 —— 腾讯云驾驶证识别接口
云计算·腾讯云
记得开心一点嘛4 天前
实名认证 —— 腾讯云身份证认证接口
云计算·腾讯云
极客奇点4 天前
存储成本深度优化:冷热分层与生命周期管理——从视频平台年省200万实践解析智能存储架构
阿里云·架构·降本增效·云存储·云成本优化
思绪漂移4 天前
从博客到播客:文本转音频的全流程技术点
人工智能·音频·腾讯云·信息传播