.NET 6/ASP.NET Core中更新Azure Storage现有Blob及启用版本控制方法
Azure Blob存储启用版本控制并上传更新文件的实现
一、启用容器的版本控制
Azure Blob容器默认不开启版本控制,必须显式启用,这样后续更新Blob时才会自动保留旧版本。你可以通过代码在创建容器时启用,或者对已存在的容器更新设置:
// 创建容器时直接启用版本控制 await blobContainer.CreateIfNotExistsAsync(new BlobContainerCreateOptions { AccessType = PublicAccessType.None, VersioningEnabled = true }); // 针对已存在的容器,确保版本控制处于启用状态 await blobContainer.SetVersioningPolicyAsync(new BlobVersioningPolicy(BlobVersioningPolicyType.Enabled));
二、修正并更新上传代码
原代码存在变量顺序错误(先调用GetBlobClient再定义fileName),同时建议用using语句自动管理文件流。开启版本控制后,直接覆盖上传Blob就会自动生成新版本,无需额外操作:
var connectionString = _settings.appConfig.StorageConnectionString; BlobServiceClient blobServiceClient = new BlobServiceClient(connectionString); BlobContainerClient blobContainer = blobServiceClient.GetBlobContainerClient("nasir-container"); // 启用容器版本控制 await blobContainer.CreateIfNotExistsAsync(new BlobContainerCreateOptions { AccessType = PublicAccessType.None, VersioningEnabled = true }); await blobContainer.SetVersioningPolicyAsync(new BlobVersioningPolicy(BlobVersioningPolicyType.Enabled)); // 定义本地文件路径 string localFilePath = "D:/Workspace/Adappt/MyWordFile.docx"; // 获取Blob客户端(存储中的Blob名称可自定义,这里用本地文件名) BlobClient blobClient = blobContainer.GetBlobClient(Path.GetFileName(localFilePath)); // 使用using自动释放流资源 using (FileStream uploadFileStream = System.IO.File.OpenRead(localFilePath)) { // 覆盖上传,开启版本控制后会自动生成新版本 await blobClient.UploadAsync(uploadFileStream, overwrite: true); }
三、获取特定版本的Blob内容
要访问旧版本的文件,需先获取版本ID,再通过版本ID定位到目标版本:
// 列出该Blob的所有版本 var blobVersions = blobClient.GetVersionsAsync(); await foreach (var version in blobVersions) { Console.WriteLine($"版本ID: {version.VersionId}, 修改时间: {version.LastModified}"); } // 根据版本ID获取指定版本的Blob string targetVersionId = "你的目标版本ID"; BlobClient versionedBlobClient = blobContainer.GetBlobClient(blobClient.Name).WithVersion(targetVersionId); // 下载该版本的文件到本地 using (FileStream downloadStream = System.IO.File.OpenWrite("D:/Workspace/Adappt/旧版本_MyWordFile.docx")) { await versionedBlobClient.DownloadToAsync(downloadStream); }
关键说明
- 启用版本控制后,每次覆盖Blob都会自动创建新版本,旧版本会被保留(可通过生命周期规则配置自动清理旧版本)
WithVersion方法是访问特定版本Blob的核心- 用
using管理流资源能避免手动关闭流导致的资源泄漏
内容的提问来源于stack exchange,提问作者mnu-nasir
相关产品推荐
相关产品推荐

