首页 > 解决方案 > 如何在.net核心中做出下载文件响应?

问题描述

我正在使用endpoints.Map("/{*name}", RequestDelegate)方法来制作下载文件 API。

RequestDelegate处理程序方法中,我使用await context.Response.SendFileAsync(IFileInfo)方法来返回文件。

然后,我在浏览器中请求这个API,但是浏览器没有下载它,而是直接在浏览器中显示文件内容。我的代码中缺少什么。我希望浏览器下载文件。

截图

await context.Response.SendFileAsync(GetFile(val));

private IFileInfo GetFile(string file_name)
{
    string downloadPath = Configuration.GetSection("DownloadFilePath").Get<string>();
    IFileProvider provider = new PhysicalFileProvider(AppDomain.CurrentDomain.BaseDirectory);
    IFileInfo fileInfo = provider.GetFileInfo($"{downloadPath}/{file_name}");
    return fileInfo;
}

标签: c#asp.net-coreasp.net-web-api

解决方案


有几件事情需要考虑:

  1. 浏览器现在检测文件并尝试像 PDF、Txt 文件一样自己处理它们,因为它们可以打开那些显示内容而不是下载的文件。
  2. 要进行下载,重要的是确保您发送正确的 HTML 标头,并使 Content-Disposition ( https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition ) 告诉和强制浏览器按照您的意愿行事。
  3. 如果您A对文件使用 HTML 标记,则可以使用download属性来表示相同的内容。但我不确定它是否完全支持。

在您的代码中,我看到您没有发送任何类型的标头。最好设置缓存到期、处置、文件的内容类型(因为它是动态系统可能会发送默认内容类型,这可能会导致客户端工具混淆。)和内容长度。这些是发送以使您的代码正常工作的重要标头。

我不确定如何出于技术文档的目的正确回答它,但这些是我指导我的团队编写相同代码时的步骤。

编辑:

这些要点与编程语言无关,但与 Web 架构(HTTP 标准)有关。


推荐阅读