You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用容器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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 10:50:22