【问题标题】:How to delete a file from azure blob storage after downloading it下载后如何从 azure blob 存储中删除文件
【发布时间】: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 被阻止时不会死锁。

标签: c# asp.net-mvc azure .net-core azure-blob-storage


【解决方案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 :)
猜你喜欢
  • 2018-04-25
  • 1970-01-01
  • 2021-12-08
  • 2020-08-08
  • 2021-12-12
  • 1970-01-01
  • 2018-11-07
相关资源
最近更新 更多