在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;
}
}