在C#/.NET中上传文件到腾讯云对象存储(COS)

参考文档

[说明文档](https://cloud.tencent.com/document/product/436/7749)

[官方示例代码](https://console.cloud.tencent.com/api/explorer?Product=cos&Version=2018-11-26&Action=PutObject)

一、前置准备

显然你需要一个腾讯云账号,没买过对象存储的会送一段时间的50G的额度。

然后根据提示,创建一个存储桶(相当于NAS的数据池),其中会让你设置公私读写权限、版本控制等,自己看情况选择,我是选择公读私写。

申请访问秘钥

点击以后就会生成一个秘钥

安装配套SDK

在VS的nuget包管理器浏览搜索Tencent.QCloud.Cos,然后选择项目安装

二、程序

原版的代码可以在开头提到的参考文档处进行查看,这里针对实际需要进行了修改,主要是配置文件的获取和修改为依赖注入。

在程序中你需要填写修改代码中的以下部分:数据桶的服务器所在的区域的简称、秘钥ID、秘钥key、数据桶的名称、上传文件名称(在代码中变量名为key)。

需要注意的是,数据桶中可以存在文件夹,所以在上传的时候可以在对象键(key,也就是文件名称)前附加文件夹的名称,可以生效,例:/images/filename.jpg 就会被上传到桶中images文件夹下。

public class TencenCOSPutObjectModel
    {
        private CosXml cosXml;
        private readonly IConfiguration configuration;

        public TencenCOSPutObjectModel(IConfiguration configuration)
        {
            CosXmlConfig config = new CosXmlConfig.Builder()
              .SetRegion(configuration.GetConnectionString("COSRegion")!) // 设置默认的区域, COS 地域的简称请参照 https://cloud.tencent.com/document/product/436/6224 
                  .Build();

            string secretId = configuration.GetConnectionString("COSSecretId")!;   // 云 API 密钥 SecretId, 获取 API 密钥请参照 https://console.cloud.tencent.com/cam/capi
            string secretKey = configuration.GetConnectionString("COSSecretKey")!; // 云 API 密钥 SecretKey, 获取 API 密钥请参照 https://console.cloud.tencent.com/cam/capi
            long durationSecond = 600;          //每次请求签名有效时长,单位为秒
            QCloudCredentialProvider qCloudCredentialProvider = new DefaultQCloudCredentialProvider(secretId,
              secretKey, durationSecond);

            this.cosXml = new CosXmlServer(config, qCloudCredentialProvider);
            this.configuration = configuration;
        }

        /**
         * 简单上传对象 并返回相对的key,上传失败会返回null
         * return key
         */
        public string PutObject(FileInfo file)
        {
            // 存储桶名称,此处填入格式必须为 bucketname-APPID, 其中 APPID 获取参考 https://console.cloud.tencent.com/developer
            string bucket = configuration.GetConnectionString("COSBucket")!;
            string key = configuration.GetConnectionString("COSUploadDir") + file.Name; //对象键,也就是文件名称
            string srcPath = file.FullName;//本地文件绝对路径
            try
            {
                PutObjectRequest request = new PutObjectRequest(bucket, key, srcPath);
                //设置进度回调
                request.SetCosProgressCallback(delegate (long completed, long total)
                {
                    Console.WriteLine(String.Format("progress = {0:##.##}%", completed * 100.0 / total));
                });
                //执行请求
                PutObjectResult result = cosXml.PutObject(request);
                //对象的 eTag
                string eTag = result.eTag;
                //打印请求结果
                Console.WriteLine(result.GetResultInfo());
            }
            catch (COSXML.CosException.CosClientException clientEx)
            {
                //请求失败
                Console.WriteLine("CosClientException: " + clientEx);
                return null!;
            }
            catch (COSXML.CosException.CosServerException serverEx)
            {
                //请求失败
                Console.WriteLine("CosServerException: " + serverEx.GetInfo());
                return null!;
            }
            return key;
        }

    }