使用带有.NET Web Api 2的Angular2将文件从Azure存储下载到客户端

时间:2017-11-10 16:22:36

标签: download stream azure-storage-blobs

我正在尝试将blob存储中的1GB文件下载到客户端。我在Memory Stream之前使用过,我得到OutOfMemory异常。

现在我正在尝试从blob打开一个读取流并将其直接发送给客户端。

 [HttpGet]
 [ResponseType(typeof(HttpResponseMessage))]
 public async Task<HttpResponseMessage> DownloadAsync(string file)
 {
     HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
     var stream = await blob.OpenReadAsync("container", file);
     result.Content = new StreamContent(stream);
     return result;
 }

文件正确下载,但问题是:代码在客户端下载完整的流,然后客户端看到下载的文件。 enter image description here 我希望客户端将文件视为已下载,因此用户知道他正在下载某些内容。不只是阻止请求并等到它完成。

我在Angular2中使用FileSaver:

this.controller.download('data.zip').subscribe(
      data => {
        FileSaver.saveAs(data, 'data.zip');
      });

有人知道如何解决这个问题吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

要解决此问题,您需要使用以下javascript代码:

var fileUri = "http://localhost:56676/api/blobfile";  //replace with your web api endpoint
var link = document.createElement('a');
document.body.appendChild(link);
link.href = fileUri;
link.click();

然后在你的后端,这样做:

HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
var stream = await blob.OpenReadAsync("container", file);
result.Content = new StreamContent(stream);
result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
{
    FileName = "data.zip"
};
result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
return result;

答案 1 :(得分:0)

我有同样的问题。

我整理出的解决方案是-

首先,只有当客户端尝试从blob下载文件时,才会发生预期的行为,通常我更喜欢从客户端本身下载文件。

根据您的情况,尝试获取文件blob uri并执行以下一些操作,以使用Angular Router或仅使用window.location.href在浏览器中打开文件。

window.location.href =“ https://*/filename.xlsx”

这对我有用。