Azure.Storage.Blobs 是上传文件的唯一推荐路径,需三步:安装v12.x包、用BlobServiceClient连接、经ContainerClient和BlobClient调用UploadAsync;大文件须流式上传并配置TransferOptions,权限需匹配认证方式,容器还需设置PublicAccess和CORS。

用 Azure.Storage.Blobs 上传文件最简路径
别碰老的 Microsoft.Azure.Storage.Blob,它已弃用且不支持 .NET 6+ 的默认 TLS 版本。新 SDK Azure.Storage.Blobs 是唯一推荐路径,上传逻辑三步到位:
- 安装 NuGet 包:
Azure.Storage.Blobs(v12.x) - 用
BlobServiceClient连接账户(支持连接字符串、AAD 或 SAS token) - 获取
BlobContainerClient→BlobClient→ 调用UploadAsync()
示例代码片段(连接字符串方式):
BlobServiceClient serviceClient = new BlobServiceClient("DefaultEndpointsProtocol=https;AccountName=xxx;AccountKey=yyy;EndpointSuffix=core.windows.net");
BlobContainerClient containerClient = serviceClient.GetBlobContainerClient("mycontainer");
BlobClient blobClient = containerClient.GetBlobClient("uploads/photo.jpg");
await blobClient.UploadAsync("C:\local\photo.jpg", new BlobHttpHeaders { ContentType = "image/jpeg" });
上传大文件时必须分块:用 UploadAsync(Stream, ...) + TransferOptions
直接传 string 路径会把整个文件读进内存,超 100MB 就容易 OOM;生产环境务必用 Stream 流式上传,并控制并发与块大小:
-
TransferOptions中设MaximumConcurrency(建议 4–8),避免打爆客户端带宽或触发服务端限流 -
InitialTransferSize和MaximumTransferSize控制单块大小(默认 4MB,大文件可提到 8–32MB) - 若上传中断,SDK 不自动续传;需自行捕获
RequestFailedException并检查ErrorCode是否为ConditionNotMet或网络超时
关键调用示例:
var options = new BlobUploadOptions
{
TransferOptions = new Azure.Core.Http.TransferOptions
{
MaximumConcurrency = 4,
InitialTransferSize = 8 * 1024 * 1024,
MaximumTransferSize = 32 * 1024 * 1024
}
};
await blobClient.UploadAsync(stream, options);
权限与连接方式选错,403 This request is not authorized 就绕不开
本地开发时用连接字符串最方便,但上线后强烈建议切换到 Azure AD 托管身份(Managed Identity)或用户委托 SAS,否则密钥轮换和审计都成问题。常见权限陷阱:
- 用连接字符串但账户密钥被禁用 → 检查 Azure Portal 中“访问密钥”状态是否为“启用”
- 用 AAD 登录但应用注册没赋权 → 容器级别需至少
Storage Blob Data Contributor角色(不是“Reader”) - 用 SAS token 却漏了
spr=https或过期 → 生成时明确指定HttpsOnly = true和ExpiresOn
验证权限最快方法:用 BlobContainerClient.ExistsAsync(),返回 false 或抛 403 就说明认证/授权环节卡住了。
UploadAsync 返回成功 ≠ 文件可访问:检查容器公共访问级别和 CORS
上传成功只代表 blob 写入完成,能否被浏览器直链访问还取决于两件事:
- 容器的
PublicAccessType必须设为Blob或Container(默认是None,即私有) - 如果前端 JS 通过 Fetch/Axios 访问,Azure Blob 默认无 CORS 配置,会报跨域错误 → 需在 Portal 或 CLI 中显式添加规则,比如允许
*来源、GET方法、Content-Type头
设置容器公开级别示例:
await containerClient.SetAccessPolicyAsync(PublicAccessType.Blob);
CORS 配置不可跳过,尤其当你用 blobClient.Uri 拼出直链并在网页中 <img src="..."> 渲染时——没配 CORS,控制台就稳稳报 No 'Access-Control-Allow-Origin' header。










