【问题标题】:Download CSV from Azure Blob Storage to Browser将 CSV 从 Azure Blob 存储下载到浏览器
【发布时间】:2018-06-21 15:28:08
【问题描述】:

我可以成功上传到 Azure Blob 存储,但在下载文件(csv 和 pdf 文件)时遇到问题。

我的目标是将文件下载到浏览器(因为这将是一个网络应用程序,我不知道将文件下载到的本地路径)。

        string connString = ConfigurationManager.ConnectionStrings["MyTestStorageAccount"].ConnectionString;
        CloudStorageAccount cloudStorageAccount = CloudStorageAccount.Parse(connString);
        CloudBlobClient _blobClient = cloudStorageAccount.CreateCloudBlobClient();
        CloudBlobContainer _cloudBlobContainer = _blobClient.GetContainerReference("filestorage");
        CloudBlockBlob _blockBlob = _cloudBlobContainer.GetBlockBlobReference("testfile.csv");
        Response.AddHeader("Content-Disposition", "attachment; filename=" + "testfile.csv");
        _blockBlob.DownloadToStream(Response.OutputStream);

【问题讨论】:

  • 请进行编辑以包括您所看到的行为:错误等。正如所写,我们看不到您遇到的问题类型。
  • 您的 blob 是否设置为私有访问策略?

标签: azure azure-storage azure-blob-storage


【解决方案1】:

我在mvc中按照你的代码,在我的站点中下载了csv,当我打开它时,里面的内容不是我添加的,而是一些html模板。

如果这是您的问题,您可以参考以下代码:

public ActionResult Download()
    {
CloudStorageAccount cloudStorageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("StorageConnectionString"));

            CloudBlobClient _blobClient = cloudStorageAccount.CreateCloudBlobClient();
            CloudBlobContainer _cloudBlobContainer = _blobClient.GetContainerReference("data");
            CloudBlockBlob _blockBlob = _cloudBlobContainer.GetBlockBlobReference("table.csv");
            Response.AddHeader("Content-Disposition", "attachment; filename=" + "table.csv");
             MemoryStream ms = new MemoryStream();
            _blockBlob.DownloadToStream(ms);
            ms.Position = 0;
            return File(ms, "application/octet-stream", "table.csv");
}

你也可以return Redirect(blobUrl);

顺便说一句,如果您的 blob 是 private,您需要创建一个具有 Read 权限的 Shared Access SignatureContent-Disposition 标头集,并基于此创建 blob URL 和使用该网址。在这种情况下,blob 内容将直接从存储流式传输到客户端浏览器。

更多details,参考以下代码:

public ActionResult Download()
    {
        CloudStorageAccount account = new CloudStorageAccount(new StorageCredentials("accountname", "accountkey"), true);
        var blobClient = account.CreateCloudBlobClient();
        var container = blobClient.GetContainerReference("container-name");
        var blob = container.GetBlockBlobReference("file-name");
        var sasToken = blob.GetSharedAccessSignature(new SharedAccessBlobPolicy()
            {
                Permissions = SharedAccessBlobPermissions.Read,
                SharedAccessExpiryTime = DateTime.UtcNow.AddMinutes(10),//assuming the blob can be downloaded in 10 miinutes
            }, new SharedAccessBlobHeaders()
            {
                ContentDisposition = "attachment; filename=file-name"
            });
        var blobUrl = string.Format("{0}{1}", blob.Uri, sasToken);
        return Redirect(blobUrl);
    }

【讨论】:

    【解决方案2】:

    我已经测试了您的代码,它运行良好。您可以告诉我们您的问题,例如错误信息、更详细的要求等。

    我创建了一个通用处理程序(ashx)来测试它,这是我测试过的代码供您参考:

    <%@ WebHandler Language="C#" Class="DownloadHandler" %>
    
    using System.Web;
    using Microsoft.WindowsAzure.Storage;
    using Microsoft.WindowsAzure.Storage.Blob;
    
    public class DownloadHandler : IHttpHandler {
    
        public void ProcessRequest (HttpContext context) {
    
    
            CloudStorageAccount storageAccount = CloudStorageAccount.Parse("DefaultEndpointsProtocol=https;AccountName=your_account;AccountKey=your_key;EndpointSuffix=core.windows.net");
    
            CloudBlobClient cloudBlobClient = storageAccount.CreateCloudBlobClient();
    
            CloudBlobContainer container = cloudBlobClient.GetContainerReference("mycontainer");
            container.CreateIfNotExists();
    
            CloudBlockBlob blob = container.GetBlockBlobReference("4.PNG");
            context.Response.AddHeader("Content-Disposition", "attachment; filename=" + "4.PNG");
            blob.DownloadToStream(context.Response.OutputStream);
    
        }
    
        public bool IsReusable {
            get {
                return false;
            }
        }
    
    }
    

    结果截图:

    当我通过 IE 11 访问这个处理程序时

    【讨论】:

      猜你喜欢
      • 2015-08-08
      • 2021-04-29
      • 2018-05-31
      • 2013-03-18
      • 2011-06-18
      • 2017-11-04
      • 2020-11-11
      • 2019-12-19
      • 2019-09-05
      相关资源
      最近更新 更多