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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:43:43