我正在尝试将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;
}
文件正确下载,但问题是:代码在客户端下载完整的流,然后客户端看到下载的文件。
我希望客户端将文件视为已下载,因此用户知道他正在下载某些内容。不只是阻止请求并等到它完成。
我在Angular2中使用FileSaver:
this.controller.download('data.zip').subscribe(
data => {
FileSaver.saveAs(data, 'data.zip');
});
有人知道如何解决这个问题吗?
谢谢!
答案 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”
这对我有用。