387 lines
16 KiB
C#
387 lines
16 KiB
C#
using System;
|
||
using System.Collections.Generic;
|
||
using System.Linq;
|
||
using System.Text;
|
||
using System.Threading.Tasks;
|
||
using COSXML;
|
||
using COSXML.Auth;
|
||
using COSXML.Model.Object;
|
||
using COSXML.Model.Bucket;
|
||
using COSXML.CosException;
|
||
using COSXML.Transfer;
|
||
using COSXML.Model.Tag;
|
||
|
||
namespace VRS.Util
|
||
{
|
||
public class CosClient
|
||
{
|
||
CosXmlServer cosXml;
|
||
private string appid;
|
||
private string region;
|
||
|
||
/// <summary>
|
||
/// 初始化
|
||
/// </summary>
|
||
/// <param name="_appid">appid</param>
|
||
/// <param name="_region">地域</param>
|
||
public CosClient(string _appid, string _region)
|
||
{
|
||
appid = _appid;
|
||
region = _region;
|
||
|
||
//初始化 CosXmlConfig
|
||
//string appid = "100011070645";
|
||
//string region = "ap-guangzhou";
|
||
CosXmlConfig config = new CosXmlConfig.Builder()
|
||
.IsHttps(true)
|
||
.SetConnectionTimeoutMs(300000)//5分钟,单位:毫秒,默认:45秒
|
||
.SetAppid(appid)
|
||
.SetRegion(region)
|
||
.SetDebugLog(true)
|
||
.Build();
|
||
|
||
QCloudCredentialProvider cosCredentialProvider = null;
|
||
|
||
string secretId = "AKIDWopdBXCgU3QknbvOwHNExTnZXHk8eDLL"; //"云 API 密钥 SecretId";
|
||
string secretKey = "tViEcbpSz5vWsADiqk7D3vV3OSZQ0JMD"; //"云 API 密钥 SecretKey";
|
||
long durationSecond = 600; //secretKey 有效时长,单位为 秒
|
||
cosCredentialProvider = new DefaultQCloudCredentialProvider(secretId, secretKey, durationSecond);
|
||
|
||
//初始化 CosXmlServer
|
||
cosXml = new CosXmlServer(config, cosCredentialProvider);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 高级接口上传文件对象
|
||
/// </summary>
|
||
/// <param name="buketName">存储桶名称</param>
|
||
/// <param name="key">对象键</param>
|
||
/// <param name="srcPath">本地文件路径</param>
|
||
/// <returns></returns>
|
||
public ResponseModel UploadFile(string buketName, string key, byte[] file)
|
||
{
|
||
try
|
||
{
|
||
string bucket = buketName + "-" + appid; //存储桶名称 格式:BucketName-APPID
|
||
PutObjectRequest putObjectRequest = new PutObjectRequest(bucket, key, file);
|
||
|
||
//执行请求
|
||
PutObjectResult result = cosXml.PutObject(putObjectRequest);
|
||
if (result.httpCode == 200)
|
||
{
|
||
return new ResponseModel { Code = 200, Message = result.eTag };
|
||
}
|
||
else
|
||
{
|
||
return new ResponseModel { Code = result.httpCode, Message = result.httpMessage };
|
||
}
|
||
}
|
||
catch (COSXML.CosException.CosClientException clientEx)
|
||
{
|
||
//请求失败
|
||
return new ResponseModel { Code = 500, Message = "CosClientException: " + clientEx.Message };
|
||
}
|
||
catch (COSXML.CosException.CosServerException serverEx)
|
||
{
|
||
//请求失败
|
||
return new ResponseModel { Code = 500, Message = "CosServerException: " + serverEx.GetInfo() };
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 删除文件对象
|
||
/// </summary>
|
||
/// <param name="buketName">存储桶名称</param>
|
||
/// <param name="key">对象键</param>
|
||
/// <returns></returns>
|
||
public ResponseModel DeleteFile(string buketName, string key)
|
||
{
|
||
try
|
||
{
|
||
string bucket = buketName + "-" + appid; //存储桶名称 格式:BucketName-APPID
|
||
DeleteObjectRequest request = new DeleteObjectRequest(bucket, key);
|
||
|
||
//执行请求
|
||
DeleteObjectResult result = cosXml.DeleteObject(request);
|
||
if (result.httpCode == 200)
|
||
{
|
||
return new ResponseModel { Code = 200, Message = result.httpMessage };
|
||
}
|
||
else
|
||
{
|
||
return new ResponseModel { Code = result.httpCode, Message = result.httpMessage };
|
||
}
|
||
}
|
||
catch (COSXML.CosException.CosClientException clientEx)
|
||
{
|
||
//请求失败
|
||
return new ResponseModel { Code = 500, Message = "CosClientException: " + clientEx.Message };
|
||
}
|
||
catch (COSXML.CosException.CosServerException serverEx)
|
||
{
|
||
//请求失败
|
||
return new ResponseModel { Code = 500, Message = "CosServerException: " + serverEx.GetInfo() };
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 高级接口下载文件对象
|
||
/// </summary>
|
||
/// <param name="buketName">存储桶名称</param>
|
||
/// <param name="key">存储键</param>
|
||
/// <param name="localDir">本地下载保存路径</param>
|
||
/// <param name="localFileName">本地下载保存文件名称</param>
|
||
/// <returns></returns>
|
||
public async Task<ResponseModel> TransferDownloadObject(string buketName, string key, string localDir, string localFileName)
|
||
{
|
||
//.cssg-snippet-body-start:[transfer-download-object]
|
||
// 初始化 TransferConfig
|
||
TransferConfig transferConfig = new TransferConfig();
|
||
|
||
// 初始化 TransferManager
|
||
TransferManager transferManager = new TransferManager(cosXml, transferConfig);
|
||
|
||
String bucket = buketName + "-" + appid; //存储桶,格式:BucketName-APPID
|
||
String cosPath = key; //对象在存储桶中的位置标识符,即称对象键
|
||
|
||
// 下载对象
|
||
COSXMLDownloadTask downloadTask = new COSXMLDownloadTask(bucket, cosPath,
|
||
localDir, localFileName);
|
||
|
||
//downloadTask.progressCallback = delegate (long completed, long total)
|
||
//{
|
||
// Console.WriteLine(String.Format("progress = {0:##.##}%", completed * 100.0 / total));
|
||
//};
|
||
|
||
try
|
||
{
|
||
COSXML.Transfer.COSXMLDownloadTask.DownloadTaskResult result = await
|
||
transferManager.DownloadAsync(downloadTask);
|
||
if (result.httpCode == 200)
|
||
{
|
||
return new ResponseModel { Code = 200, Message = result.eTag };
|
||
}
|
||
else
|
||
{
|
||
return new ResponseModel { Code = result.httpCode, Message = result.httpMessage };
|
||
}
|
||
}
|
||
catch (Exception e)
|
||
{
|
||
//请求失败
|
||
return new ResponseModel { Code = 500, Message = "CosClientException: " + e.Message };
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 设置跨域配置
|
||
/// </summary>
|
||
/// <param name="buketName">存储桶名称</param>
|
||
/// <param name="corsId">规则的 ID</param>
|
||
/// <param name="domainName">域名多个以,隔开</param>
|
||
/// <returns></returns>
|
||
public ResponseModel PutBucketCORS(string buketName, string corsId, string domainName)
|
||
{
|
||
try
|
||
{
|
||
string bucket = buketName + "-" + appid; //格式:BucketName-APPID
|
||
PutBucketCORSRequest request = new PutBucketCORSRequest(bucket);
|
||
//设置跨域访问配置 CORS
|
||
COSXML.Model.Tag.CORSConfiguration.CORSRule corsRule =
|
||
new COSXML.Model.Tag.CORSConfiguration.CORSRule();
|
||
//corsRule.id = corsId;
|
||
corsRule.maxAgeSeconds = 5;
|
||
|
||
corsRule.allowedOrigins = new List<string>();
|
||
var list = domainName.Split(',');
|
||
foreach (var item in list)
|
||
{
|
||
corsRule.allowedOrigins.Add(item);//域名
|
||
}
|
||
|
||
corsRule.allowedMethods = new List<string>();
|
||
corsRule.allowedMethods.Add("PUT");
|
||
corsRule.allowedMethods.Add("GET");
|
||
corsRule.allowedMethods.Add("POST");
|
||
corsRule.allowedMethods.Add("DELETE");
|
||
corsRule.allowedMethods.Add("HEAD");
|
||
|
||
corsRule.allowedHeaders = new List<string>();
|
||
corsRule.allowedHeaders.Add("*");
|
||
|
||
//corsRule.exposeHeaders = new List<string>();
|
||
//corsRule.exposeHeaders.Add("x-cos-meta-x1");
|
||
|
||
request.SetCORSRule(corsRule);
|
||
//执行请求
|
||
PutBucketCORSResult result = cosXml.PutBucketCORS(request);
|
||
if (result.httpCode == 200)
|
||
{
|
||
return new ResponseModel { Code = 200, Message = result.httpMessage };
|
||
}
|
||
else
|
||
{
|
||
return new ResponseModel { Code = result.httpCode, Message = result.httpMessage };
|
||
}
|
||
}
|
||
catch (COSXML.CosException.CosClientException clientEx)
|
||
{
|
||
//请求失败
|
||
return new ResponseModel { Code = 500, Message = "CosClientException: " + clientEx.Message };
|
||
}
|
||
catch (COSXML.CosException.CosServerException serverEx)
|
||
{
|
||
//请求失败
|
||
return new ResponseModel { Code = 500, Message = "CosServerException: " + serverEx.GetInfo() };
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 查询跨域配置
|
||
/// </summary>
|
||
/// <param name="buketName">存储桶名称</param>
|
||
/// <returns></returns>
|
||
public ResponseModel GetBucketCORS(string buketName)
|
||
{
|
||
try
|
||
{
|
||
string bucket = buketName + "-" + appid; //格式:BucketName-APPID
|
||
GetBucketCORSRequest request = new GetBucketCORSRequest(bucket);
|
||
//执行请求
|
||
GetBucketCORSResult result = cosXml.GetBucketCORS(request);
|
||
if (result.httpCode == 200)
|
||
{
|
||
//存储桶的 CORS 配置信息
|
||
CORSConfiguration conf = result.corsConfiguration;
|
||
//请求成功
|
||
return new ResponseModel { Code = 200, Message = "成功", data = conf };
|
||
}
|
||
else
|
||
{
|
||
return new ResponseModel { Code = result.httpCode, Message = result.httpMessage };
|
||
}
|
||
}
|
||
catch (COSXML.CosException.CosClientException clientEx)
|
||
{
|
||
//请求失败
|
||
return new ResponseModel { Code = 500, Message = "CosClientException: " + clientEx.Message };
|
||
}
|
||
catch (COSXML.CosException.CosServerException serverEx)
|
||
{
|
||
//请求失败
|
||
return new ResponseModel { Code = 500, Message = "CosServerException: " + serverEx.GetInfo() };
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 删除存储桶跨域规则
|
||
/// </summary>
|
||
/// <param name="buketName">存储桶名称</param>
|
||
/// <returns></returns>
|
||
public ResponseModel DeleteBucketCors(string buketName)
|
||
{
|
||
try
|
||
{
|
||
string bucket = buketName + "-" + appid; //格式:BucketName-APPID
|
||
DeleteBucketCORSRequest request = new DeleteBucketCORSRequest(bucket);
|
||
//执行请求
|
||
DeleteBucketCORSResult result = cosXml.DeleteBucketCORS(request);
|
||
//请求成功
|
||
return new ResponseModel { Code = result.httpCode, Message = result.httpMessage };
|
||
}
|
||
catch (COSXML.CosException.CosClientException clientEx)
|
||
{
|
||
//请求失败
|
||
return new ResponseModel { Code = 500, Message = "CosClientException: " + clientEx.Message };
|
||
}
|
||
catch (COSXML.CosException.CosServerException serverEx)
|
||
{
|
||
//请求失败
|
||
return new ResponseModel { Code = 500, Message = "CosServerException: " + serverEx.GetInfo() };
|
||
}
|
||
}
|
||
|
||
///// <summary>
|
||
///// 简单上传文件最大支持上传5GB文件
|
||
///// </summary>
|
||
///// <param name="buketName">存储桶名称</param>
|
||
///// <param name="key">对象键</param>
|
||
///// <param name="srcPath">本地文件路径</param>
|
||
///// <returns></returns>
|
||
//public ResponseModel UploadFile(string buketName, string key, string srcPath)
|
||
//{
|
||
// try
|
||
// {
|
||
// string bucket = buketName + "-" + appid; //存储桶名称 格式:BucketName-APPID
|
||
// 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);
|
||
// //result.GetResultInfo()
|
||
// if (result.httpCode == 200)
|
||
// {
|
||
// return new ResponseModel { Code = 200, Message = result.eTag };
|
||
// }
|
||
// else
|
||
// {
|
||
// return new ResponseModel { Code = result.httpCode, Message = result.httpMessage };
|
||
// }
|
||
|
||
// }
|
||
// catch (CosClientException clientEx)
|
||
// {
|
||
// return new ResponseModel { Code = 500, Message = "CosClientException: " + clientEx.Message };
|
||
// }
|
||
// catch (CosServerException serverEx)
|
||
// {
|
||
// return new ResponseModel { Code = 500, Message = "CosServerException: " + serverEx.GetInfo() };
|
||
// }
|
||
//}
|
||
|
||
///// <summary>
|
||
///// 简单上传文件最大支持上传5GB文件
|
||
///// </summary>
|
||
///// <param name="buketName">存储桶名称</param>
|
||
///// <param name="key">对象键</param>
|
||
///// <param name="file">文件二进制数据</param>
|
||
///// <returns></returns>
|
||
//public ResponseModel UploadFile(string buketName, string key, byte[] file)
|
||
//{
|
||
// try
|
||
// {
|
||
// string bucket = buketName + "-" + appid; //存储桶名称 格式:BucketName-APPID
|
||
// PutObjectRequest request = new PutObjectRequest(bucket, key, file);
|
||
// //设置进度回调
|
||
// request.SetCosProgressCallback(delegate (long completed, long total)
|
||
// {
|
||
// Console.WriteLine(String.Format("progress = {0:##.##}%", completed * 100.0 / total));
|
||
// });
|
||
// //执行请求
|
||
// PutObjectResult result = cosXml.PutObject(request);
|
||
// //result.GetResultInfo()
|
||
// if (result.httpCode == 200)
|
||
// {
|
||
// return new ResponseModel { Code = 200, Message = result.eTag };
|
||
// }
|
||
// else
|
||
// {
|
||
// return new ResponseModel { Code = result.httpCode, Message = result.httpMessage };
|
||
// }
|
||
|
||
// }
|
||
// catch (CosClientException clientEx)
|
||
// {
|
||
// return new ResponseModel { Code = 500, Message = "CosClientException: " + clientEx.Message };
|
||
// }
|
||
// catch (CosServerException serverEx)
|
||
// {
|
||
// return new ResponseModel { Code = 500, Message = "CosServerException: " + serverEx.GetInfo() };
|
||
// }
|
||
//}
|
||
}
|
||
}
|