服务文件以供下载。浏览器忽略文件名并使用 "file.nothing" 代替
Serving file for download. Browser ignores filename and uses "file.nothing" instead
我的应用程序有一个调用 API 函数来生成报告并将该报告提供给浏览器以供下载的 blazor 页面。
为此,我使用 ControllerBase.File
方法,指定建议的文件名。
浏览器成功开始下载,但忽略了建议的文件名。相反,给出“file.nothing”
我在 Chrome 和 Firefox 中都看到过这种行为。
最小可重现示例
[HttpPost("report/level2/deliverable")]
public async Task<IActionResult> GenerateLevel2DeliverableReport()
{
byte[] bytes = Encoding.ASCII.GetBytes("This is some text");
string filename = "test.txt";
return File(bytes, "text/plain", filename);
}
在实际情况下,我在返回 Word 文档和 Zip 文件及其各自的内容类型时遇到了同样的问题。
Postman 捕获的 HTTP 响应
内容配置(在图像中很难看清)是
attachment; filename=test.txt; filename*=UTF-8''test.txt
有人对浏览器忽略文件名的原因有任何想法吗?
嗯,这很尴尬。
我以为下载是由
行产生的
return File(bytes, "text/plain", filename);
但事实证明,API 调用包含在一些 javascript 代码中,这些代码使用正则表达式从 HTTP header 中提取文件名并开始下载。
如果正则表达式匹配失败,它是 hard-coding 文件名到“file.nothing”
难怪我 google 搜索“file.nothing” 都是徒劳的。
正则表达式存在问题,已由一位同事修复,现在一切正常。
我的应用程序有一个调用 API 函数来生成报告并将该报告提供给浏览器以供下载的 blazor 页面。
为此,我使用 ControllerBase.File
方法,指定建议的文件名。
浏览器成功开始下载,但忽略了建议的文件名。相反,给出“file.nothing”
我在 Chrome 和 Firefox 中都看到过这种行为。
最小可重现示例
[HttpPost("report/level2/deliverable")]
public async Task<IActionResult> GenerateLevel2DeliverableReport()
{
byte[] bytes = Encoding.ASCII.GetBytes("This is some text");
string filename = "test.txt";
return File(bytes, "text/plain", filename);
}
在实际情况下,我在返回 Word 文档和 Zip 文件及其各自的内容类型时遇到了同样的问题。
Postman 捕获的 HTTP 响应
内容配置(在图像中很难看清)是
attachment; filename=test.txt; filename*=UTF-8''test.txt
有人对浏览器忽略文件名的原因有任何想法吗?
嗯,这很尴尬。 我以为下载是由
行产生的return File(bytes, "text/plain", filename);
但事实证明,API 调用包含在一些 javascript 代码中,这些代码使用正则表达式从 HTTP header 中提取文件名并开始下载。 如果正则表达式匹配失败,它是 hard-coding 文件名到“file.nothing” 难怪我 google 搜索“file.nothing” 都是徒劳的。
正则表达式存在问题,已由一位同事修复,现在一切正常。