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

.NET 6使用SAS令牌上传文件到Azure Blob存储时遇FormatException问题求助

.NET 6使用SAS令牌上传文件到Azure Blob存储时遇FormatException问题求助

嗨,我来帮你排查这个问题!你遇到的FormatException核心原因是你把Blob SAS URL当成了标准的存储连接字符串传给了BlobClient的构造函数——这个构造函数的connectionString参数只认Azure存储的标准连接字符串格式,直接传SAS URL肯定会解析失败的。

先给你几个可行的解决方案,都是基于你偏好的Azure.Storage.Blobs包:

方案一:直接用完整的Blob SAS URL创建BlobClient

如果已经有容器级的SAS URL,你可以直接拼接出目标Blob的SAS URL,然后用它实例化BlobClient:

// 替换成你生成的容器SAS URL(比如https://xxx.blob.core.windows.net/your-container?sv=xxx&sp=c...)
string containerSasUrl = "你的容器SAS URL";
string blobName = dayStamp;

// 拼接出具体Blob的SAS URL(注意处理URL末尾的?,并转义Blob名称避免特殊字符问题)
string blobSasUrl = $"{containerSasUrl.TrimEnd('?')}/{Uri.EscapeDataString(blobName)}";
BlobClient blobClient = new BlobClient(new Uri(blobSasUrl));

// 执行上传操作,示例:上传本地文件
using var fileStream = File.OpenRead("待上传文件的本地路径");
await blobClient.UploadAsync(fileStream, overwrite: false);

方案二:通过BlobContainerClient获取BlobClient(更适合批量操作)

如果需要对同一个容器下的多个Blob操作,这种方式更灵活:

string containerSasUrl = "你的容器SAS URL";
// 用容器SAS URL创建容器客户端
BlobContainerClient containerClient = new BlobContainerClient(new Uri(containerSasUrl));
// 获取目标Blob的客户端
BlobClient blobClient = containerClient.GetBlobClient(dayStamp);

// 执行上传
using var fileStream = File.OpenRead("待上传文件的本地路径");
await blobClient.UploadAsync(fileStream, overwrite: false);

方案三:构造包含SAS的连接字符串(贴近你原来的写法)

如果你还是想保留类似原来用连接字符串的写法,可以构造一个带SAS的特殊连接字符串,格式是:BlobEndpoint=https://<账户名>.blob.core.windows.net/;SharedAccessSignature=<你的SAS令牌>,注意SAS令牌不要带前面的?:

string storageAccountName = "你的存储账户名称";
// 替换成你的SAS令牌(比如sv=2022-11-02&ss=b&srt=c&sp=c&se=...)
string sasToken = "你的SAS令牌(去掉开头的?)";
string sasConnectionString = $"BlobEndpoint=https://{storageAccountName}.blob.core.windows.net/;SharedAccessSignature={sasToken}";

// 现在可以用这个连接字符串创建BlobClient了
BlobClient blobClient = new BlobClient(sasConnectionString, containerName, dayStamp);

// 执行上传
using var fileStream = File.OpenRead("待上传文件的本地路径");
await blobClient.UploadAsync(fileStream, overwrite: false);

额外注意事项

  • 再确认下你生成SAS时的权限:确保勾选了Create(对应权限字符c),这样才能上传新Blob
  • 检查SAS的有效期:确保当前时间在SAS的起始时间(st)和过期时间(se)之间,你设置起始时间为过去这点是对的
  • 存储账户开启分层命名空间(HNS)不影响容器级SAS的使用,这个因素可以排除

按照上面的方法调整代码,应该就能解决这个格式异常的问题了!

备注:内容来源于stack exchange,提问作者Petr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 15:22:37