c# - 如何在.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;
}
解决方案
有几件事情需要考虑:
- 浏览器现在检测文件并尝试像 PDF、Txt 文件一样自己处理它们,因为它们可以打开那些显示内容而不是下载的文件。
- 要进行下载,重要的是确保您发送正确的 HTML 标头,并使 Content-Disposition ( https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition ) 告诉和强制浏览器按照您的意愿行事。
- 如果您
A
对文件使用 HTML 标记,则可以使用download
属性来表示相同的内容。但我不确定它是否完全支持。
在您的代码中,我看到您没有发送任何类型的标头。最好设置缓存到期、处置、文件的内容类型(因为它是动态系统可能会发送默认内容类型,这可能会导致客户端工具混淆。)和内容长度。这些是发送以使您的代码正常工作的重要标头。
我不确定如何出于技术文档的目的正确回答它,但这些是我指导我的团队编写相同代码时的步骤。
编辑:
这些要点与编程语言无关,但与 Web 架构(HTTP 标准)有关。
推荐阅读
- wordpress - Gutenberg 使用块过滤器添加样式属性
- reactjs - 表单提交后Formik字段未清除
- sql - 如何将 Case 语句的 Null 值返回到 Group by
- java - 如何创建 2 个以上的 HBase 表?
- windows - NASM Windows 中的多核:输入时 lpParameter 数据错误
- exception - 为什么在使用 JavaFX 构建 imageView 时会出现 ArrayIndexOutOfBoundsException?
- go - google/wire:这是单例模式的用例吗?
- apache-kafka-streams - 添加一个全局存储供转换器使用
- java - 递归地洗牌两个字符串以生成另一个字符串
- excel - 如何让 REGEXMATCH 在一系列单元格中查找多个术语,而不是查看一个单元格?