在实现文件下载功能时通常有以下几种方式:
1.直接给出下载地址,例如http://****.com/demo.docx,这种是最直接的方式,任何人都可以下载,无法控制用户的权限。
2.验证权限后通过代码来读取文件内容,这样做可以实现权限的控制,但是将文件读取到内存中然后再发送给用户,会造成很大的资源开销。示例代码:
HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);
string filePath = Path.Combine(new DirectoryInfo(_hostingEnvironment.WebRootPath).Parent.Parent.FullName + "/ExportFile/Excel/", $"{fileName}");
Stream stream = new FileStream(filePath, FileMode.Open); //读取文件
response.Content = new StreamContent(stream);
response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
response.Content.Headers.ContentDisposition.FileName = fileName;
3.X-Accel-Redirect是一种将文件下载请求由后端应用转交给前端 web 服务器处理的机制,它可以消除后端程序既要读文件又要处理发送的压力,从而显著提高服务器效率,特别是处理大文件下载的情形下。示例代码:
HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);
response.Content = new StringContent("");
response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/ms-excel");
response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
response.Content.Headers.ContentDisposition.FileName = fileName;
response.Content.Headers.Add("X-Accel-Redirect", $"/Api/ExportExcel/{fileName}"); //X-Accel-Redirect