C# 操作AWS S3方法 C#如何使用AWSSDK上传文件到S3

来源:这里教程网 时间:2026-02-21 17:42:30 作者:

AWSSDK.S3 NuGet 包怎么选

.NET 项目里用 AWS S3,必须安装

AWS.SDK.S3
,但要注意:它不是独立包,而是由
AWS.SDK.Core
+
AWS.SDK.S3
组成。NuGet 搜索时别只输 “AWS S3”,直接搜
AWS.SDK.S3
,选官方 Amazon Web Services 发布的那一个(ID 确实就是
AWS.SDK.S3
)。旧版
AWSSDK
(无点号、大版本 2.x)已弃用,不支持 .NET 6+ 的默认 TLS 1.2+ 要求,会静默失败。

安装命令:
dotnet add package AWS.SDK.S3
若项目是 .NET Framework 4.7.2+,也推荐用新版 SDK,旧版
AWSSDK.S3
(v3.3.x)在上传大文件时容易因分块重试逻辑缺陷卡住
不要手动引用
AWS.SDK.Core
单独包——
AWS.SDK.S3
已声明依赖,重复引用可能引发
AssemblyLoadException

初始化 S3Client 的三种常见方式

AmazonS3Client
是操作入口,初始化方式决定凭证来源和区域行为:

用默认凭据链(推荐开发/测试):
var client = new AmazonS3Client()
,它会按顺序查:环境变量 →
~/.aws/credentials
→ EC2 实例角色。注意 Windows 上路径是
%USERPROFILE%.aws\credentials
显式传入凭证和区域:
var client = new AmazonS3Client(new BasicAWSCredentials("AKIA...", "xxx"), RegionEndpoint.USEast1)
;但密钥硬编码进代码是严重安全风险,仅限临时调试
使用配置对象(适合多环境):
var config = new AmazonS3Config { RegionEndpoint = RegionEndpoint.USEast2 };
var client = new AmazonS3Client(config);
此时仍走默认凭据链,只是强制指定区域——S3 桶所在区域必须匹配,否则报
AmazonS3Exception: The bucket you are attempting to access must be addressed using the specified endpoint

上传小文件用 PutObjectAsync,别用 UploadAsync

PutObjectAsync
是最直接的方式,适合 ≤5 MB 的文件:

它把整个流一次性发到 S3,无分块、无进度回调、无自动重试(SDK 内部有基础重试,但不可配置)

示例:

using var stream = File.OpenRead(@"C:\data\report.pdf");
await client.PutObjectAsync(new PutObjectRequest
{
  BucketName = "my-bucket",
  Key = "uploads/report.pdf",
  InputStream = stream,
  ContentType = "application/pdf"
});

别误用

TransferUtility.UploadAsync
:它是为大文件(>5 MB)设计的,内部做分块上传(Multipart Upload),但需要额外初始化
TransferUtility
实例,且默认启用 MD5 校验——若网络不稳定或文件内容动态生成,MD5 计算可能失败并抛
AmazonS3Exception: Unable to compute MD5 hash

如果真要传大文件,用

TransferUtility
前务必设
UseMD5 = false
,或改用底层
InitiateMultipartUpload
+ 分块
UploadPart
手动控制

Key 中的路径分隔符和中文处理

S3 本身没有“文件夹”概念,

Key
是纯字符串,
/
只是约定俗成的分隔符:

Key = "logs/2024/06/app.log"
是合法的,控制台会显示为嵌套目录,但本质还是单个对象
中文或 Unicode 字符在
Key
中可以,但必须确保编码一致:.NET 默认 UTF-8,S3 接收时也按 UTF-8 解析,一般没问题;但如果前端 JavaScript 用
encodeURIComponent
编码后再传 Key,后端 C# 就得先
Uri.UnescapeDataString
,否则出现乱码 Key 导致 404
避免 Key 以
/
开头(如
/images/logo.png
),部分 SDK 版本会静默截断,最终存成
images/logo.png
;也不要用
..\
或空格开头,虽不报错但易引发权限或签名异常

S3 上传看着简单,真正上线时最容易栽在凭据加载顺序、区域错配、Key 编码不一致这三处——它们都不报编译错误,但运行时要么 403,要么 400,要么对象“消失”。

相关推荐