在 C# (.NET) 中操作 S3 和云存储:AWS SDK 与 MinIO

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

面向 .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){                    

推荐