下载后如何从 azure blob 存储中删除文件
Posted
技术标签:
【中文标题】下载后如何从 azure blob 存储中删除文件【英文标题】:How to delete a file from azure blob storage after downloading it 【发布时间】:2019-12-15 08:33:38 【问题描述】:我正在开发用于存储我的文件的 blob 存储系统。 现在,我可以从我的 blob 容器中删除/取消删除文件。 我正在尝试将文件从我的控制器下载回浏览器并删除该文件。
这是我的下载控制器
public ActionResult DownloadBlob(string name)
CloudBlobContainer container = GetCloudBlobContainer();
var resultSegment = container.ListBlobsSegmentedAsync(name.Split('/')[0],true ,BlobListingDetails.All,null,null,null,null).Result;
CloudBlockBlob target = (CloudBlockBlob)resultSegment.Results.FirstOrDefault(e => e.Uri.Segments.Last() == name.Split('/')[1]);
//var directory = container.GetDirectoryReference(name.Split('/')[0]);
//var block = directory.GetBlockBlobReference(name.Split('/')[1]);
if (target.ExistsAsync().Result)
else
target.UndeleteAsync().Wait();
Stream stream = target.OpenReadAsync().Result;
string contentType = target.Properties.ContentType;
;
target.DeleteIfExistsAsync();
return new FileStreamResult(stream, contentType)
FileDownloadName = "Downloaded_" + name.Split('/')[1]
;
所以如果我有一个已删除的文件,我想取消删除它,下载它然后再次删除它。(软删除已打开) 有没有办法做到这一点,以便在返回语句后执行删除
【问题讨论】:
您应该将控制器操作更改为async
,这样它在.Result
被阻止时不会死锁。
【参考方案1】:
您是否在当前代码中遇到“找不到 blob”错误?如是, 可以使用 MemoryStream 和 blob.DownloadToStream(memoryStream),下载完成后直接删除 blob,return 语句后不需要调用 delete。
我安装了这个 blob 存储的 nuget 包:Microsoft.Azure.Storage.Blob, Version 11.0.0,它支持异步和非异步 blob 方法。您可以使用此包或根据评论将当前代码更改为异步。
示例代码在我身边运行良好(测试代码,您可以随意修改以满足您的需要):
public IActionResult Contact()
string account_name = "xx";
string account_key = "xx";
CloudStorageAccount storageAccount = new CloudStorageAccount(new StorageCredentials(account_name, account_key), true);
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer blobContainer = blobClient.GetContainerReference("test1");
CloudBlockBlob blob = blobContainer.GetBlockBlobReference("df1.JPG");
if (!blob.Exists())
blob.Undelete();
MemoryStream memoryStream = new MemoryStream();
blob.DownloadToStream(memoryStream);
memoryStream.Position = 0;
string contentType = blob.Properties.ContentType;
blob.DeleteIfExists();
return new FileStreamResult(memoryStream, contentType)
FileDownloadName = blob.Name
;
【讨论】:
谢谢,这非常适合我的需要。另外,我今天学到了一些新东西。我不知道您必须将 MemoryStream Position 重置回 0. 2-for-1 :)以上是关于下载后如何从 azure blob 存储中删除文件的主要内容,如果未能解决你的问题,请参考以下文章