Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 浏览器没有';下载文件时不显示进度条_C#_Asp.net_Angular_File_Asp.net Web Api - Fatal编程技术网

C# 浏览器没有';下载文件时不显示进度条

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

我有一个带有ASP.NET Web API的Angle应用程序

我想下载存储在服务器上的文件。目前,这是我的代码:

[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');