中心调研修改,oss测试

This commit is contained in:
2026-01-04 10:35:15 +08:00
parent 1a6ec6b315
commit 339414694d
6 changed files with 282 additions and 8 deletions
@@ -16,6 +16,7 @@ using Minio;
using Minio.DataModel;
using Minio.DataModel.Args;
using Minio.Exceptions;
using System.IO;
using System.Reactive.Linq;
using System.Runtime.InteropServices;
using System.Web;
@@ -142,6 +143,11 @@ public enum ObjectStoreUse
public interface IOSSService
{
public void SetImmediateArchiveRule(string prefix,
StorageClass targetStorageClass,
string ruleId = "immediate-archive");
public Task<string> UploadToOSSAsync(Stream fileStream, string oosFolderPath, string fileRealName, bool isFileNameAddGuid = true);
public Task<string> UploadToOSSAsync(string localFilePath, string oosFolderPath, bool isFileNameAddGuid = true, bool randomFileName = false);
@@ -182,7 +188,185 @@ public class OSSService : IOSSService
}
/// <summary>
/// 将指定前缀下的所有现有文件立即转为目标存储类型
/// 核心:Days = 0 表示对所有存量文件立即生效
/// </summary>
/// <param name="prefix">要转换的文件前缀,如 "project-a/logs/"</param>
/// <param name="targetStorageClass">目标存储类型</param>
/// <param name="ruleId">规则ID,默认为"immediate-archive"</param>
public void SetImmediateArchiveRule(string prefix,
StorageClass targetStorageClass,
string ruleId = "immediate-archive")
{
BackBatchGetToken();
var aliConfig = ObjectStoreServiceOptions.AliyunOSS;
var _ossClient = new OssClient(RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? aliConfig.EndPoint : aliConfig.InternalEndpoint, AliyunOSSTempToken.AccessKeyId, AliyunOSSTempToken.AccessKeySecret, AliyunOSSTempToken.SecurityToken);
try
{
// 1. 先获取现有的所有生命周期规则(避免覆盖)
var existingRules = new List<Aliyun.OSS.LifecycleRule>();
try
{
var existingRuleList = _ossClient.GetBucketLifecycle(aliConfig.BucketName);
if (existingRuleList != null)
{
existingRules.AddRange(existingRuleList);
Console.WriteLine($"找到 {existingRules.Count} 条现有规则");
}
}
catch (OssException ex) when (ex.ErrorCode == "NoSuchLifecycle")
{
// 如果没有生命周期规则,继续创建新规则
Console.WriteLine("当前Bucket无生命周期规则,将创建新规则");
}
// 2. 创建立即生效的转换规则
ruleId = $"{ruleId}_{prefix}";
var immediateRule = new Aliyun.OSS.LifecycleRule
{
ID = ruleId,
Prefix = prefix,
Status = RuleStatus.Enabled,
Transitions = new Aliyun.OSS.LifecycleRule.LifeCycleTransition[]
{
new Aliyun.OSS.LifecycleRule.LifeCycleTransition
{
// 关键设置:Days = 0 表示对最后修改时间≤当前的所有文件生效
LifeCycleExpiration =
{
Days = 1
},
StorageClass = targetStorageClass
}
}
};
// 3. 移除同名的旧规则(如果存在)
existingRules.RemoveAll(r => r.ID == ruleId);
// 4. 添加新规则到规则列表
existingRules.Add(immediateRule);
var request = new SetBucketLifecycleRequest(aliConfig.BucketName)
{
LifecycleRules= existingRules
};
_ossClient.SetBucketLifecycle(request);
Console.WriteLine("✅ 立即归档规则设置成功!");
Console.WriteLine($" 规则ID: {ruleId}");
Console.WriteLine($" 前缀: {prefix}");
Console.WriteLine($" 目标存储类型: {targetStorageClass}");
Console.WriteLine($" 生效时间: 将在下次生命周期扫描时生效(通常24小时内)");
}
catch (OssException ex)
{
Console.WriteLine($"❌ 设置失败 [错误码: {ex.ErrorCode}]");
Console.WriteLine($" 详细: {ex.Message}");
// 处理特定错误
if (ex.ErrorCode == "InvalidArgument")
{
Console.WriteLine(" 可能原因:存储类型不支持或参数格式错误");
}
}
catch (Exception ex)
{
Console.WriteLine($"❌ 发生未知错误: {ex.Message}");
}
}
//public async Task SetLifecycle(string lifecycle)
//{
// if (ObjectStoreServiceOptions.ObjectStoreUse == "AliyunOSS")
// {
// var aliConfig = ObjectStoreServiceOptions.AliyunOSS;
// var _ossClient = new OssClient(RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? aliConfig.EndPoint : aliConfig.InternalEndpoint, AliyunOSSTempToken.AccessKeyId, AliyunOSSTempToken.AccessKeySecret, AliyunOSSTempToken.SecurityToken);
// var rule = new Aliyun.OSS.LifecycleRule
// {
// ID = "ArchiveOldFiles",
// Prefix = "", // 全 bucket 生效
// Status = RuleStatus.Enabled
// };
// // 30 天转低频
// rule.Transitions.Add(new Aliyun.OSS.LifecycleRule.LifeCycleTransition
// {
// Days = 30,
// StorageClass = StorageClass.IA
// });
// // 180 天转归档
// rule.Transitions.Add(new Aliyun.OSS.LifecycleRule.LifeCycleTransition
// {
// Days = 180,
// StorageClass = StorageClass.Archive
// });
// // 365 天转冷归档
// rule.Transitions.Add(new Aliyun.OSS.LifecycleRule.LifeCycleTransition
// {
// Days = 365,
// StorageClass = StorageClass.ColdArchive
// });
// // 730 天转深度归档
// rule.Transitions.Add(new Aliyun.OSS.LifecycleRule.LifeCycleTransition
// {
// Days = 730,
// StorageClass = StorageClass.DeepColdArchive
// });
// var request = new SetBucketLifecycleRequest(aliConfig.BucketName);
// request.AddLifecycleRule(rule);
// _ossClient.SetBucketLifecycle(request);
// }
// else if (ObjectStoreServiceOptions.ObjectStoreUse == "AWS")
// {
// var awsConfig = ObjectStoreServiceOptions.AWS;
// var credentials = new SessionAWSCredentials(AWSTempToken.AccessKeyId, AWSTempToken.SecretAccessKey, AWSTempToken.SessionToken);
// //提供awsEndPoint(域名)进行访问配置
// var clientConfig = new AmazonS3Config
// {
// RegionEndpoint = RegionEndpoint.USEast1,
// UseHttp = true,
// };
// var amazonS3Client = new AmazonS3Client(credentials, clientConfig);
// }
// else
// {
// throw new BusinessValidationFailedException("未定义的存储介质类型");
// }
//}
/// <summary>
/// oosFolderPath 不要 "/ "开头 应该: TempFolder/ChildFolder