在ASP.NET Core MVC控制器中,要返回文件时,需要通过以下代码添加响应头,以便告诉浏览器以什么格式显示文件。
例如,如果要返回一个PDF文件,可以使用以下代码:
[HttpGet]
public async Task DownloadFile()
{
var file = Path.Combine(Directory.GetCurrentDirectory(), "Files", "example.pdf");
if (!System.IO.File.Exists(file))
return NotFound();
var memory = new MemoryStream();
using (var stream = new FileStream(file, FileMode.Open))
{
await stream.CopyToAsync(memory);
}
memory.Position = 0;
return File(memory, "application/pdf", Path.GetFileName(file));
}
然而,如果存在防火墙或代理服务器,可能会跟踪请求与响应,并在控制某些头信息时出现问题。在这种情况下,可以使用以下代码,启用SSL协议中的强制下载。
[HttpGet]
public async Task DownloadFile()
{
var file = Path.Combine(Directory.GetCurrentDirectory(), "Files", "example.pdf");
if (!System.IO.File.Exists(file))
return NotFound();
var memory = new MemoryStream();
using (var stream = new FileStream(file, FileMode.Open))
{
await stream.CopyToAsync(memory);
}
memory.Position = 0;
// 添加响应头以区分一般响应和文件响应,并强制下载文件。
Response.Headers.Add("Content-Disposition", $"attachment; filename={Path.GetFileName(file)}");
return File(memory, "application/pdf");
}
当使用这种方式时,浏览器会自动下载文件,而不是在窗口中打开它。