如何用容器SAS令牌批量上传文件至Azure Blob存储?
生成容器级SAS令牌并批量上传文件
你原来的代码里虽然把Resource设为"c"(代表容器),但错误指定了BlobName,这会导致生成的SAS仍绑定单个Blob。生成容器级SAS时,不需要设置BlobName,直接基于容器客户端生成即可,以下是修正后的实现:
一、生成容器级SAS令牌
// 获取目标容器的客户端 BlobContainerClient containerClient = this.container; BlobSasBuilder sasBuilder = new BlobSasBuilder() { BlobContainerName = containerClient.Name, Resource = "c", // "c"明确指定为容器级SAS StartsOn = DateTimeOffset.UtcNow, ExpiresOn = DateTimeOffset.UtcNow.AddHours(this.sasTokenExpiryHours), }; // 设置权限:这里需要Write权限用于上传,若需要列出容器文件可添加List sasBuilder.SetPermissions(BlobSasPermissions.Write | BlobSasPermissions.List); // 生成带SAS的容器Uri Uri containerSasUri = containerClient.GenerateSasUri(sasBuilder); // 提取纯SAS令牌(后续上传时可按需拼接) string sasToken = containerSasUri.Query;
二、使用容器级SAS批量上传文件
方式1:通过Azure Blob Storage SDK上传
直接用带SAS的容器客户端循环处理文件,代码更简洁:
// 用容器SAS Uri创建可操作的客户端 BlobContainerClient sasEnabledContainer = new BlobContainerClient(containerSasUri); // 示例:待上传的本地文件路径列表 List<string> localFilePaths = new List<string> { "docs/report.pdf", "images/avatar.png", "data/logs.txt" }; foreach (var filePath in localFilePaths) { // 用文件名作为Blob的存储名称,支持子目录格式(如"images/avatar.png") string blobName = Path.GetFileName(filePath); BlobClient targetBlob = sasEnabledContainer.GetBlobClient(blobName); // 执行上传,overwrite设为true可覆盖同名文件 await targetBlob.UploadAsync(filePath, overwrite: true); }
方式2:通过HTTP PUT请求上传
如果不想依赖SDK,可手动构造每个Blob的上传Uri,拼接SAS令牌后发送请求:
// 容器的基础地址(不带SAS) string containerBaseUrl = containerClient.Uri.AbsoluteUri; // 示例:待上传的文件集合(Blob名称+二进制内容) List<(string BlobName, byte[] FileContent)> filesToUpload = new List<(string, byte[])> { ("docs/report.pdf", File.ReadAllBytes("docs/report.pdf")), ("images/avatar.png", File.ReadAllBytes("images/avatar.png")) }; using (HttpClient httpClient = new HttpClient()) { foreach (var file in filesToUpload) { // 构造Blob的完整上传Uri:容器地址+转义后的Blob名称+SAS令牌 string uploadUri = $"{containerBaseUrl}/{Uri.EscapeDataString(file.BlobName)}{sasToken}"; // 发送PUT请求上传二进制内容 HttpResponseMessage response = await httpClient.PutAsync(uploadUri, new ByteArrayContent(file.FileContent)); response.EnsureSuccessStatusCode(); // 验证上传是否成功 } }
注意事项
- 权限配置:仅上传的话
Write权限足够;如果需要先查看容器内已有文件,需添加List权限。 - 虚拟目录:上传到子目录时,直接把Blob名称设为
"子目录/文件名"格式即可,无需提前创建目录。 - 有效期:只要SAS令牌未过期,所有基于该令牌的上传请求都会被允许,可在有效期内完成批量上传。
内容的提问来源于stack exchange,提问作者Rocky Mishra
相关产品推荐
相关产品推荐

