将CSV从Azure Blob存储下载到浏览器

时间:2018-06-20 16:42:55

标签: azure azure-storage azure-storage-blobs

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

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

        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);

2 个答案:

答案 0 :(得分:0)

我已经测试了您的代码,效果很好。您可以告诉我们您的问题,例如错误消息,更详细的要求等。

我创建了一个通用处理程序(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访问此处理程序时

enter image description here

答案 1 :(得分:0)

我在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是私有,则需要创建一个具有 Read 权限和Shared Access Signature标头的Content-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);
    }
相关问题