Azure下载blob到用户计算机

时间:2014-05-09 23:02:20

标签: asp.net-mvc azure

当我遇到一些问题时,我正在处理我的下载blob功能。

我希望用户能够下载blob,并且当该项目下载到用户计算机时,我想要该项目上的特定文件名。我还希望用户决定该项目应保存到哪个文件夹。

到目前为止,这是我不太好看的代码:

    var fileName = "tid.txt9c6b412a-270a-4f67-8e65-7ce2bf87503d";
    var containerName = "uploads";
    CloudStorageAccount account = CloudStorageAccount.DevelopmentStorageAccount;
    var blobClient = account.CreateCloudBlobClient();
    var container = blobClient.GetContainerReference(containerName);
    var blob = container.GetBlockBlobReference(fileName);
    using (var filestream = System.IO.File.OpenWrite(@"C:\Info\tid.txt9c6b412a-270a-4f67-8e65-7ce2bf87503d"))
    {
        blob.DownloadToStream(filestream);
    }

fileName = blob名称

是否可以更改名称?文件结尾全部搞砸了我的guid。 目前,下载到文件夹是C:\ Info ..当网站发布时,这将如何工作?如何让用户决定该项目应保存到哪个文件夹?我这样做了吗?

提前谢谢你 /菲利普

3 个答案:

答案 0 :(得分:1)

  

网站发布后如何运作?

对用户来说很慢,对你来说很贵。您正在通过您的应用程序流式传输BLOB,因此您将遇到瓶颈。使用Shared Access Signatures并直接从浏览器下载blob。使用Content-Disposition作为URL的一部分,让浏览器通过“另存为”对话框提示用户。请参阅Javascript download a URL - Azure Blob Storage

答案 1 :(得分:1)

您的问题:是否可以更改名称?

blob的名称和用户磁盘上的名称是您的选择。除了可能避免混淆之外,没有必要匹配它们。您的用户是否会再次上传它(可能会有更改?)保存一些元数据,以便原始文件和更新的文件可以在blob存储中相关。

执行该行后:

var blob = container.GetBlockBlobReference(fileName);

...你告诉Azure所有它需要知道找到blob。

在行中:

using (var filestream = System.IO.File.OpenWrite...

...您告诉您的代码将文件放在磁盘上的位置。你说它是一个网站,所以这个声明会把文件放到网络服务器的磁盘上,而不是你的用户的磁盘上。要将文件放到用户磁盘上,还需要一个步骤 - 将文件从Web服务器(Web角色实例)下载到用户的计算机。您可以让他控制文件夹和文件名。以下是MSDN中的相关部分:

Downloading and Uploading Files

答案 2 :(得分:0)

此下载功能是否可以接受?慢/昂贵还是它得到的好?

public void DownloadFile(string blobName)

{
    CloudBlobContainer blobContainer = CloudStorageServices.GetCloudBlobsContainer();

    CloudBlockBlob blob = blobContainer.GetBlockBlobReference(blobName);
    MemoryStream memStream = new MemoryStream();
    blob.DownloadToStream(memStream);

    Response.ContentType = blob.Properties.ContentType;
    Response.AddHeader("Content-Disposition", "Attachment; filename=" + blobName.ToString());
    Response.AddHeader("Content-Length", (blob.Properties.Length - 1).ToString());
    Response.BinaryWrite(memStream.ToArray());
    Response.End();
}