C# 浏览器没有';下载文件时不显示进度条
我有一个带有ASP.NET Web API的Angle应用程序 我想下载存储在服务器上的文件。目前,这是我的代码:C# 浏览器没有';下载文件时不显示进度条,c#,asp.net,angular,file,asp.net-web-api,C#,Asp.net,Angular,File,Asp.net Web Api,我有一个带有ASP.NET Web API的Angle应用程序 我想下载存储在服务器上的文件。目前,这是我的代码: [HttpGet] [Route("downloadFile")] [JwtAuthentication] //Only a connected user can download the file public async Task<HttpResponseMessage> DownloadFile(string path) { HttpResponseMes
[HttpGet]
[Route("downloadFile")]
[JwtAuthentication] //Only a connected user can download the file
public async Task<HttpResponseMessage> DownloadFile(string path)
{
HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
var fileStream = File.OpenRead(path);
result.Content = new StreamContent(fileStream);
result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
result.Content.Headers.ContentLength = fileStream.Length;
result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
{
FileName = fileStream.Name,
Size = fileStream.Length
};
return result;
}
这样,我成功地从服务器下载了一个文件
但是,Chrome中的下载栏仅在下载完成后才会出现。因此,如果文件太大,用户将无法获得任何文件当前正在下载的指示
下面是正在下载的16Mb文件的屏幕截图。服务器当前正在发送数据,但下载栏未显示
然后,下载完成后,文件将显示在屏幕底部的下载栏中
如何将文件发送到浏览器,以便向用户显示此指示器
多谢各位
编辑:
正如@CodeCaster所指出的,重定向到URL是可行的,但是,我的URL是受保护的,因此只有连接的用户才能下载文件。在角度方面,只需使用锚定标记并在
href
属性中传递API URL即可
在流式传输数据之前,还要在服务器端确保设置了以下响应头
res.setHeader('content-length',data.ContentLength) (optional)
res.setHeader('content-type', mimetype);
res.setHeader('content-disposition', 'attachment; filename');
这是因为JS正在下载文件,将blob附加到文档中,然后下载blob。只有最后一部分触发下载栏。你为什么这么做?为什么不直接将用户重定向到下载URL?我忽略了一点,这很重要:我希望我的下载URL是安全的,这样只有经过身份验证的用户才能下载文件。我编辑了我的问题,以便它更清晰。@Antoine下载URL将对用户可见,即使您现在尝试这样做,正如您在第一个屏幕截图中看到的那样。你不能指望用户不把他们的开发工具作为一种安全方法。您应该使用基于cookie或基于一次性令牌的身份验证来下载文件,只需将用户重定向到正确的URL,然后让浏览器下载文件。@briman0094。当然,我的意思是,如果您试图从另一个窗口(未登录到应用程序)访问URL,服务器将响应401错误。如果您重定向用户,情况仍然如此。重定向将包括任何会话cookie,但在未登录的窗口中打开URL不会。唯一的区别是一个请求是XHR,而另一个是导航请求。
res.setHeader('content-length',data.ContentLength) (optional)
res.setHeader('content-type', mimetype);
res.setHeader('content-disposition', 'attachment; filename');