如何使用Stream上传Blob并配置BlobUploadOptions且不覆盖已有Blob?
解决Stream上传Blob时同时设置BlobUploadOptions和不覆盖已有Blob的问题
不用纠结现有重载的限制,BlobUploadOptions本身支持通过条件控制是否覆盖已有Blob:在
BlobUploadOptions的Conditions属性中配置BlobRequestConditions,设置IfNoneMatch = ETag.All,就能实现“仅当Blob不存在时才上传”的效果,等价于overwrite=false。示例代码:
// 初始化BlobClient BlobClient blobClient = new BlobClient(connectionString, containerName, blobName); // 创建BlobUploadOptions并配置不覆盖条件 var uploadOptions = new BlobUploadOptions { Conditions = new BlobRequestConditions { // 设置IfNoneMatch为ETag.All,仅当Blob不存在时上传 IfNoneMatch = ETag.All }, // 可按需添加其他配置,比如元数据、HTTP头 Metadata = new Dictionary<string, string> { { "uploadedBy", "demo" } } }; // 上传Stream using (var stream = new MemoryStream(Encoding.UTF8.GetBytes("待上传内容"))) { try { await blobClient.UploadAsync(stream, uploadOptions); Console.WriteLine("上传成功:目标Blob不存在"); } catch (RequestFailedException ex) when (ex.Status == (int)HttpStatusCode.PreconditionFailed) { Console.WriteLine("上传失败:目标Blob已存在"); } }
- 逻辑说明:当设置
IfNoneMatch = ETag.All时,Azure存储服务会检查目标Blob是否存在。如果Blob已存在,服务端会返回412 Precondition Failed错误,此时不会覆盖原有Blob;如果Blob不存在,则正常完成上传。这和overwrite=false的行为完全一致。
内容的提问来源于stack exchange,提问作者me.at.coding
相关产品推荐
相关产品推荐

