面向 .NET 开发者的 S3 与云存储简介
兼容 Amazon S3(简单存储服务)协议的云对象存储已成为存储非结构化数据的事实标准:图像、视频、备份、日志和构建产物。在 C# (.NET) 生态系统中,通过官方的 AWS SDK for .NET 或针对兼容 S3 的解决方案(MinIO、Yandex Object Storage、DigitalOcean Spaces)的轻量级客户端来实现与这些存储的交互。
在本文中,我们将介绍基本操作:连接、创建存储桶、上传、下载和删除对象。所有示例均使用 C# 和 .NET 8 编写。
安装 .NET 的 AWS SDK 库
要从 C# 操作 S3,需要安装 NuGet 包 AWS SDK for .NET — S3:
dotnet add package AWSSDK.S3dotnet add package AWSSDK.Extensions.NETCore.Setup // 用于依赖注入集成如果您使用 MinIO 或其他兼容 S3 的存储(非 AWS),使用相同的包即可——它支持自定义端点。
S3 客户端的基本配置
创建一个用于操作 S3 的客户端。下面的示例使用本地运行在 9000 端口的 MinIO:
using Amazon;using Amazon.S3;using Amazon.Runtime;
var config = new AmazonS3Config{ ServiceURL = "http://localhost:9000", // 用于 MinIO 或其他兼容 S3 的存储 ForcePathStyle = true, // MinIO 必须设置 UseHttp = true};
var credentials = new BasicAWSCredentials("minioadmin", "minioadmin");var s3Client = new AmazonS3Client(credentials, config);对于 AWS S3,只需指定区域并使用标准凭据:
var s3Client = new AmazonS3Client(RegionEndpoint.EUWest1);创建和删除存储桶
创建存储桶
public async Task CreateBucketAsync(string bucketName){ var putBucketRequest = new PutBucketRequest { BucketName = bucketName, UseClientRegion = true }; var response = await s3Client.PutBucketAsync(putBucketRequest); Console.WriteLine($"存储桶 {bucketName} 已创建。HTTP 状态码:{response.HttpStatusCode}");}检查存储桶是否存在
public async Task<bool> DoesBucketExistAsync(string bucketName){ return await AmazonS3Util.DoesS3BucketExistAsync(s3Client, bucketName);}删除存储桶
public async Task DeleteBucketAsync(string bucketName){ await s3Client.DeleteBucketAsync(bucketName); Console.WriteLine($"存储桶 {bucketName} 已删除。");}上传文件
最常见的场景是将文件上传到存储桶。使用 PutObjectAsync:
public async Task UploadFileAsync(string bucketName, string key, string filePath){ var putRequest = new PutObjectRequest { BucketName = bucketName, Key = key, FilePath = filePath, ContentType = "application/octet-stream" };
var response = await s3Client.PutObjectAsync(putRequest); Console.WriteLine($"文件 {key} 已上传。ETag:{response.ETag}");}从流上传——适用于通过 Web 表单从用户处获取的文件:
public async Task UploadFromStreamAsync(string bucketName, string key, Stream inputStream){ var putRequest = new PutObjectRequest { BucketName = bucketName, Key = key, InputStream = inputStream }; await s3Client.PutObjectAsync(putRequest);}下载文件
可以将对象下载到文件或流中:
public async Task DownloadFileAsync(string bucketName, string key, string downloadPath){