直接在 Internet Explorer 中打开下载时出现文件名问题

Posted

技术标签:

【中文标题】直接在 Internet Explorer 中打开下载时出现文件名问题【英文标题】:Issue with file name when directly opening download in Internet Explorer 【发布时间】:2021-04-07 02:31:50 【问题描述】:

我们有一个 Java Web 应用程序,它可以生成报告并将其作为二进制响应直接提供。直到最近,我们才以这种方式生成 PDF 文件(由浏览器直接打开),但最近我们还添加了将报告生成为 XLS 文件的功能。在“你想做什么”弹出框中选择“打开”时,这似乎会在 Internet Explorer 中产生问题。

提供报告的 ​​URL 格式为“http://localhost:8080/ias/ReportsClientInterface?req=fetch&jobid=2352837_1609341332985”。我们设置的 MIME 类型是“application/vnd.ms-excel”,Content-Disposition 标头是“filename=[name].xls”,其中 [name] 可以根据报告的标题而有所不同。在 Internet Explorer(在 Windows 10 上运行的 11)中,浏览器显示“你想用 [文件名] 做什么?” popup。弹出窗口中的 [filename] 正确显示了 Content-Disposition 标头指定的文件名。如果选择“保存”,则为文件选择的名称也与该标题匹配。 However, when "open" is selected, Excel shows ReportsClientInterface (which is in the URL as shown above) as the name, instead of the expected report name.更糟糕的是,如果我们让 Excel 保持打开状态并生成第二个报告,Excel 将refuse 打开它,因为第二个报告也尝试使用名称“ReportsClientInterface”打开。

有没有办法强制 IE/Excel 遵守标题中指定的文件名,以免出现此问题?

提前致谢。

【问题讨论】:

【参考方案1】:

有没有办法强制 IE/Excel 遵守标题中指定的文件名,以免出现此问题?

改写您的问题:“有没有办法远程修复这个 IE11 错误”?

答案很明显,但令人失望:当然,不,没有。

通常的解决方法是弄乱服务器的路由系统。您不希望 URL 是 http://localhost:8080/ias/ReportsClientInterface?req=fetch&jobid=2352837_1609341332985,而是希望它是 http://localhost:8080/ias/report/descriptiveNameOfReport/[name].xls?jobid=2352837_1609341332985

请注意,作为更一般的说明,在您的 URL 中包含 ReportsClientInterface 非常难看,这表明您通常在编写 Web 服务时搞砸了路由部分。网址很重要。多加注意它们,不要接受任何导致这种混乱的路由系统(路由 = 运行以将 URL 绑定到某个处理程序的进程,例如 /ias/ReportsClientInterface - 您编写的 java 代码是为了对此作出响应。这就是所谓的“路由”)。

我假设您正在使用自动路由系统,即您可能有一个名为 ReportsClientInterface 的类,并且现有的路由系统使用它来自动加载类。或者你有一些系统会产生例如将此 URL 链接到您的课程的 XML。

无论哪种方式,查看您拥有的 Web 框架并弄清楚如何控制路由,然后花点时间盘点您公开的每个服务和页面,并为所有这些考虑一个不错的 URL 方案。然后实现它。

每个网络框架的路由都不同,因此在不知道您使用哪一个的情况下,我无法进一步详细说明如何完成这项工作。

【讨论】:

所以我要问的问题是: 1. 这是一个已知的 IE 错误还是我的标题中的错误导致了这个? 2. 即使是 IE 中的 bug,除了更改 URL 来解决这个问题,我还能在服务器端做些什么吗? 这是已知的,甚至可能不是一个错误,只是微软的一个奇怪的选择。 [1] 即使在不同的地方,Excel 也不能打开多个同名文件,这在现代 Excel 版本中仍然如此。没有理由这样做;这是一个技术限制。但它仍然存在。 [2] Excel 可以直接打开 URL。这很奇怪,并导致了许​​多安全漏洞,但它是一个功能并且仍然存在。这就是 [open] 所做的,因此,它必然会将 URL 直接发送到 excel,因此忽略 C-D 文件名。路由修复解决了这个问题。因此,这样做。

以上是关于直接在 Internet Explorer 中打开下载时出现文件名问题的主要内容,如果未能解决你的问题,请参考以下文章

如何阻止我的网页在 Internet Explorer 11 中打开?

selenium中的webdriver在FireFox中打开一个新的Internet Explorer选项卡

在 Internet Explorer 7 中打开多个页面的 Windows 控制台命令

在新窗口/标签中打开 Google Docs iframe 链接在 Internet Explorer 中不起作用

如何从批处理文件中打开和关闭 Internet Explorer?

每次打开IE9都会弹出“了解 Internet Explorer 9 ”的页面,怎么不让他弹出来吗?