使用GetBlockBlobReference()时如何避免字符自动转义?
解决Azure Blob GetBlockBlobReference()自动编码#字符的问题
我明白你的困扰——GetBlockBlobReference()方法确实会自动对Blob名称中的特殊字符(比如#)进行URL编码,转成%23,而且不管你是否提前用HttpUtility.UrlEncode()处理过,它都会执行这个编码逻辑,这确实不符合你的预期。
问题根源
你使用的是Azure存储旧版SDK(CloudBlockBlob属于Storage Client Library v11),其中GetBlockBlobReference()方法内部会默认对Blob名称做URL编码,目的是适配Blob服务REST API的请求规范,但如果你希望Blob名称中保留原始的#字符,就需要绕过这个自动编码的逻辑。
解决方案:直接构造CloudBlockBlob实例
你可以跳过GetBlockBlobReference(),直接通过完整的Blob URI来构造CloudBlockBlob对象,这样就能完全控制Blob名称的编码状态,保留原始的#字符。
修改后的代码片段如下:
string pvtFileName = "pvt/" + fileName.Replace(StlFilePostfix, PvtFilePostfix); // 包含#的原始名称 BlobRequestOptions bl = new BlobRequestOptions(); bl.RetryPolicy = new LinearRetry(TimeSpan.FromSeconds(50), 6); CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient(); var blobContainerPVT = blobClient.GetContainerReference(smodContainer.ToLower()); blobContainerPVT.CreateIfNotExists(); try { // 构造完整的Blob URI:容器URI + 原始Blob名称 Uri blobUri = new Uri(blobContainerPVT.Uri, pvtFileName); // 直接创建CloudBlockBlob实例,传入URI和存储凭证 CloudBlockBlob pvtBlob = new CloudBlockBlob(blobUri, blobClient.Credentials); using (var fileStream = File.OpenRead(fileFullPath.Replace(StlFilePostfix, PvtFilePostfix))) { pvtBlob.UploadFromStream(fileStream, null, bl); } } catch (Exception e) { Trace.TraceInformation(e.Message); }
注意事项
- 放心使用:
#是Azure Blob名称允许的合法字符,这种方式不会触发命名合规性问题。 - 版本适配:如果后续升级到v12+的Azure.Storage.Blobs新库,处理逻辑会略有调整,但核心思路依然是直接控制Blob名称的编码行为。
内容的提问来源于stack exchange,提问作者Austin Law
相关产品推荐
相关产品推荐

