下载后如何从 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 存储中删除文件的主要内容,如果未能解决你的问题,请参考以下文章

从 Azure Blob 存储下载文件

如何从 azure blob 存储下载文件

从 azure storage mvc 中删除 Blob

如何使用javascript从stringstream内容azure blob存储中下载png文件

如何从 Azure Blob 存储将文件下载到浏览器

如何使用条件从 Azure 存储下载 blob?