我看到您使用的是 1.7 SDK。这是 SDK 的一个小编码问题,也存在于 v2.0 中。让我们看看发生了什么。
无编码
account.CreateCloudBlobClient()
.GetContainerReference("temp")
.GetBlobReference("abc[]def.txt")
.UploadFile("myfile.txt");
如果您不对 blob 名称进行编码,您最终会收到对以下导致身份验证异常的 URL 的请求:
http://account.blob.core.windows.net/temp/abc[]def.txt
这是因为 SDK 在Uri.EscapeUriString
内部使用对您的字符串进行编码,但这没有考虑方括号。
编码
然后,您会期望以下内容可以解决问题:
account.CreateCloudBlobClient()
.GetContainerReference("temp")
.GetBlobReference(HttpUtility.UrlEncode("abc[]def.txt"))
.UploadFile("myfile.txt");
这里的问题是你最终会得到这个网址:
http://account.blob.core.windows.net/temp/abc%255b%255ddef.txt
那么这里发生了什么?调用 HttpUtility.UrlEncode 将abc[]def.txt变为abc%5B%5Ddef.txt,这是正确的。但是在内部,SDK 会再次编码这个字符串,这会导致abc%255b%255ddef.txt,这不是你想要的。
解决方法
应用包含方括号的编码的唯一方法是使用一个小的解决方法。如果您将完整 URL 传递给 GetBlobReference 方法,则 SDK 假定您自己完成了所有编码:
var container = account.CreateCloudBlobClient().GetContainerReference("temp");
var blob = container.GetBlobReference(String.Format("{0}/{1}",
container.Uri, System.Web.HttpUtility.UrlEncode("abc[]def.txt")));
blob.UploadFile("myfile.txt");
这会产生正确编码的 URL:
http://account.blob.core.windows.net/temp/abc%5b%5ddef.txt
如果您使用 CloudXplorer 之类的工具,您将看到具有正确文件名的 blob:
![在此处输入图像描述](https://i.stack.imgur.com/V6IpT.png)