ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

C# 阿里云OSS对象存储

C# 阿里云OSS对象存储 一、前言OSS对象存储可以理解为模拟电脑自带的文件资源管理器相当于在阿里云购买了一个临时盘去存储文件可以通过API调用收费模式主要集中在存储容量的大小以及流出流量即外部通过公网调用OSS存储文件二、准备1、 AccessKey And Secret阿里云网页右上角头像获取2、Bucket Name首先账户要开通OSS对象存储在“控制台”-搜索-“OSS对象存储”进入“OSS对象存储控制台”在“Bucket列表”-“创建Bucket”-完成后即可拿到 “Bucket 名称”关于创建对象存储类型的选择可以查看下方提示3、对象存储地址点击左上角”切换至轻量版“就可以查看到刚创建的存储对象鼠标单击进入的样式大概是这样下滑就可以看到API调用地址了外网地址是外部访问所调用的地址如url调用图片文件下载4、对象存储类型区分阿里云OSS目前提供5种主流存储类型覆盖从高频热数据到长期冷归档的全场景需求‌标准存储Standard‌面向热数据访问延迟低、读写性能强适合网站图片、用户头像、业务高频访问的素材支持本地冗余和同城冗余两种容灾模式。‌低频访问存储Infrequent Access‌面向每月访问频次较低的数据存储单价更低取回数据会产生少量取回费用适合备份文件、日志归档等非实时访问场景。‌归档存储Archive‌面向长期几乎不访问的归档数据存储成本极低文件读取需要等待数小时的解冻时间适合合规留存资料、历史业务备份。‌冷归档存储Cold Archive‌比归档存储成本更低解冻等待时间更长适合超长期半年以上完全不访问的冷数据。‌深度冷归档Deep Cold Archive‌成本最低的归档类型专为几乎永久不访问的合规存档数据设计存储单价仅为标准存储的1/3左右。提示一切以阿里云文档为准5、收费模式OSS的计费分为基础计费项和增值计费项两大类计费方式支持按量付费和预付费资源包两种模式https://www.aliyun.com/price/product?spma2c4g.11186623.0.0.1645772blLibWz#/oss/detail/oss三、API调用提示仅展示最基础调用样式1、前提string endpoint https://oss-cn-xxx.aliyuncs.com; // 替换为你的 Endpoint string accessKeyId xxx; // 替换为你的 AccessKey ID string accessKeySecret xxx; // 替换为你的 AccessKey Secret string bucketName xxx; // 替换为你的 Bucket 名称 var client new OssClient(endpoint, accessKeyId, accessKeySecret);下载Nuget包Aliyun.OSS.SDK.NetCore2、查询文件string nextMarker null; bool isTruncated true; int totalCount 0; while (isTruncated) { var listRequest new ListObjectsRequest(bucketName) { Marker nextMarker, MaxKeys 1000 // V1接口默认最大100也可设置更大但不超过1000 }; var result client.ListObjects(listRequest); // 处理当前页的文件 foreach (var summary in result.ObjectSummaries) { richTextBox1.AppendText($文件路径: {summary.Key}, 大小: {summary.Size},日期: {summary.LastModified} bytes\r\n); totalCount; } // 更新标记和状态 isTruncated result.IsTruncated; nextMarker result.NextMarker; } richTextBox1.AppendText($\r\n--- 列举完成共找到 {totalCount} 个文件 ---\r\n);3、创建文件夹//添加文件夹 var folderKey folder/folder1/; // 文件夹名称注意以斜杠结尾 var putObjectRequest new PutObjectRequest(bucketName, folderKey, new MemoryStream(Encoding.ASCII.GetBytes())); client.PutObject(putObjectRequest);4、删除文件夹//删除文件夹注意OSS 不支持直接删除非空文件夹需要先删除文件 var folderKey folder/newfolder/; var deleteFileRequest new DeleteObjectRequest(bucketName, folderKey); client.DeleteObject(deleteFileRequest);4、上传文件//添加文件夹 var folderKey folder/Image.png; // 文件名称注意不可斜杠结尾 var putObjectRequest new PutObjectRequest(bucketName, folderKey, new MemoryStream(Encoding.ASCII.GetBytes())); client.PutObject(putObjectRequest);5、下载文件//返回下载文件流 var imageKey folder/Image.png; // 图片名称 var getObjectRequest new GetObjectRequest(bucketName, imageKey); using (var ossObject client.GetObject(getObjectRequest)) { using (var stream ossObject.Content) { using (var fileStream new FileStream(F:\downloaded_image.png, FileMode.Create, FileAccess.Write)) { await stream.CopyToAsync(fileStream); richTextBox1.AppendText($文件已下载到: F:\\downloaded_image.png\r\n); } } }6、下载文件URL签名//生成阿里云oss对象url签名 var expiration DateTime.Now.AddMinutes(5);//5分钟后过期 var imageKey folder/Image.png; // 图片名称 var presignedRequest new GeneratePresignedUriRequest(bucketName, imageKey, SignHttpMethod.Get) { Expiration expiration }; var signedUrl client.GeneratePresignedUri(presignedRequest); richTextBox1.AppendText($签名URL: {signedUrl}\r\n);7、删除文件//删除文件 var imageKey folder/image.png; // 图片名称 var deleteFileRequest2 new DeleteObjectRequest(bucketName, imageKey); client.DeleteObject(deleteFileRequest2);8、URL路径预览图片(一)、申请一个新的二级域名作为转发oss公网地址防止强制下载文件这里不再详细讲解就是在 “域名与网站” 控制台- “云解析DNS”-“解析配置”-“公网权威解析”-主域名下“解析设置”新域名并作转发oss对象CNAME域名在oss对象存储控制台对应Bucket包详细url里可以找到oss对象存储控制台-可切换至轻量版-点击对应Bucket包-Bucket详细里往下滑(二)、关闭“阻止公共访问”Bucket包oss对象存储控制台-可切换至轻量版-点击对应Bucket包(三)、API授权文件开放string endpoint http://oss-cn-xxx.aliyuncs.com; // 替换为你的 Endpoint string accessId xxx; // 替换为你的 AccessID 阿里云账户头像下方账户id string accessKeyId xxx; // 替换为你的 AccessKey ID string accessKeySecret xxx; // 替换为你的 AccessKey Secret string bucketName xxx; // 替换为你的 Bucket 名称 string region cn-shenzhen; // 替换为你的 Region// 创建 OssClient var conf new ClientConfiguration { SignatureVersion Aliyun.OSS.SignatureVersion.V4 }; var client new OssClient(endpoint, accessKeyId, accessKeySecret, conf); client.SetRegion(region); // 定义要授权的文件夹路径以 folder/ 为例 var folderPrefix folder/*; // 构建 Bucket Policy JSON // 注意Principal 中的 UID 替换为被授权者的阿里云账号 UID 或 RAM 用户 UID // 如果授权给所有人匿名访问Principal 填 * string policy { Version: 1, Statement: [{ Effect: Allow, Action: [ oss:GetObject ], Principal: [ * ], Resource: [ ResourceInfo ], Condition: { Bool: { acs:SecureTransport: [ false ] } } }] }; // 替换占位符 policy policy.Replace(ResourceInfo, $acs:oss:*:{accessId}:{bucketName}/{folderPrefix}); richTextBox1.AppendText(policy);‌Effect: Allow‌‌含义‌‌允许‌。‌作用‌表示如果请求满足后续的所有条件Action, Principal, Resource, Condition则明确‌允许‌该操作。如果是Deny则表示拒绝。‌Action: [ oss:GetObject ]‌‌含义‌‌操作权限‌。‌作用‌指定允许执行的具体 API 操作。oss:GetObject对应下载/读取文件内容的接口。‌注意‌这里仅允许“下载”‌不允许‌上传oss:PutObject、删除oss:DeleteObject或列举文件oss:ListObjects。Action 名称对应 API / 操作功能说明‌oss:GetObject‌GetObject‌下载/读取‌对象内容。‌oss:PutObject‌PutObject‌上传/写入‌对象内容。‌oss:DeleteObject‌DeleteObject‌删除‌指定对象。‌oss:ListObjects‌ListObjects‌列举‌ Bucket 中的对象列表即查看文件列表。‌oss:GetBucketAcl‌GetBucketAcl获取 Bucket 的访问控制列表ACL信息。‌oss:PutBucketAcl‌PutBucketAcl设置 Bucket 的访问控制列表ACL。‌oss:RestoreObject‌RestoreObject解冻归档存储类型的对象使其可读取。‌oss:InitiateMultipartUpload‌InitiateMultipartUpload初始化分片上传任务大文件上传第一步。‌oss:UploadPart‌UploadPart上传分片数据大文件上传中间步骤。‌oss:CompleteMultipartUpload‌CompleteMultipartUpload完成分片上传合并文件大文件上传最后一步。‌*oss:**‌所有 OSS 操作通配符代表允许执行‌所有‌ OSS 相关操作慎用相当于完全控制权。‌Principal: [ * ]‌‌含义‌‌被授权主体‌。‌作用‌指定这条规则对谁生效。*代表‌所有用户‌包括匿名用户未登录的用户和任何阿里云账号下的用户。‌风险‌结合Allow效果这意味着任何人只要满足条件都可以访问。通常用于公开读场景但需配合严格的 Condition 使用。‌Resource: [ ResourceInfo ]‌‌含义‌‌资源范围‌。‌作用‌指定这条规则作用于哪些 OSS 资源。ResourceInfo是一个占位符实际使用时应替换为具体的资源 ARN阿里云资源名称。‌标准格式示例‌acs:oss:*:*:my-bucket/*表示my-bucket存储空间下的‌所有文件‌。acs:oss:*:*:my-bucket表示my-bucket这个‌存储空间本身‌通常用于 ListObjects 等 Bucket 级别操作。‌建议‌为了最小权限原则通常建议精确到具体前缀如acs:oss:*:*:my-bucket/public/*。‌Condition: { ... }‌‌含义‌‌生效条件‌。‌作用‌只有当请求满足这里的条件时上述的Allow才会生效。如果不满足条件即使 Action 和 Principal 匹配请求也会被拒绝除非有其他 Allow 策略。jsonBool: { acs:SecureTransport: [ false ] }‌Bool‌: 布尔值条件运算符。‌acs:SecureTransport‌: 一个特定的条件键用于检查请求是否使用了加密传输协议HTTPS。如果请求使用 ‌HTTPS‌该值为true。如果请求使用 ‌HTTP‌该值为false。‌[ false ]‌: 这里指定的值是false。
返回列表