.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
相关产品推荐
相关产品推荐

