重命名azure blob文件并下载它

时间:2017-03-10 05:55:56

标签: azure-storage azure-storage-blobs

我的azure blob中有很少的文件存储有唯一的文件名,当客户想要下载时,我想重命名为友好名称。

我仍然在我的项目中使用2014年的azure存储dll,我不打算很快更新它们。所以我不能使用内置的ContentDeposition并重命名它。

我尝试在控制器中使用以下代码:

        var blob = blobStorage.GetBlobRef("https://mysite.blob.core.windows.net/my-container/WERF3234435FFF_ERFas23E.doc");

        MemoryStream memStream = new MemoryStream();
        blob.DownloadToStream(memStream);
        Response.ContentType = blob.Properties.ContentType;
        Response.AddHeader("Content-Disposition", "Attachment; filename=abcd_New.doc");
        Response.AddHeader("Content-Length", blob.Properties.Length.ToString());
        Response.BinaryWrite(memStream.ToArray());

但它没有下载文件。

我也试过用这个:

        MemoryStream memStream = new MemoryStream();
        blob.DownloadToStream(memStream);
        System.Web.HttpContext.Current.Response.Clear();
        System.Web.HttpContext.Current.Response.ContentType = blob.Properties.ContentType;
        System.Web.HttpContext.Current.Response.AddHeader("Content-Disposition", "Attachment; filename=" + friendlyName.doc);
        System.Web.HttpContext.Current.Response.AddHeader("Content-Length", blob.Properties.Length.ToString());
        System.Web.HttpContext.Current.Response.BinaryWrite(memStream.ToArray());
        System.Web.HttpContext.Current.Response.End();

我将业务逻辑放在一个单独的解决方案中,并从那里获取blob引用到我的主要解决方案。

我错过了什么吗?

2 个答案:

答案 0 :(得分:0)

当我们谈论ASP.NET MVC时,我在代码中缺少Controller / Action?在做ASP.NET MVC时,你不应该自己写HttpContext。你有ActionResult个。

public ActionResult Download()
{
// ...
    var bytes = memStream.ToArray();
    return File(bytes, System.Net.Mime.MediaTypeNames.Application.Octet, "abcd_New.doc");
}

浏览器将决定是打开文件下载还是直接在浏览器窗口中打开它。如果您想控制它,在调用return File(...方法之前,您将需要以下代码:

var contentDisposition = new System.Net.Mime.ContentDisposition
{
    FileName = "abcd_New.doc",
    Inline = false // true will try to open in Browser, false will download
};
Response.AppendHeader("Content-Disposition", contentDisposition.ToString());

答案 1 :(得分:0)

我们需要在写入文件后回复我们的响应。我使用您提供的代码。添加以下代码后,我可以看到该文件可以从服务器下载。

Response.BinaryWrite(memStream.ToArray());

Response.Flush();
Response.End();