如何在具有内容处置嵌入式标题的情况下强制<a download>下载文件

问题描述

更新:我已经得出结论,这是一个Firefox问题。 Chrome,Chromium Edge和Safari都可以与我的解决方案完美配合。我在firefox bugtracker上创建了一个错误:https://bugzilla.mozilla.org/show_bug.cgi?id=1658877

我有一个前端,可以通过两种方式下载文件:

  1. 单击按钮1在浏览器中打开文件
  2. 单击按钮2将文件下载到硬盘驱动器

此方法在前端的工作方式是使用<a download="FILENAME.EXTENSION">标签和属性来强制下载文件,并使用<a>(无download)使其打开在浏览器中。

之所以可行,是因为API从不返回内容处置标头(我们使用ASP.NET Core的File()方法,而没有使用fileName参数,因此在这种情况下不会添加内容处置标头) download属性确保已下载。

请先阅读背景信息,然后再继续

要尝试解决上述背景信息的问题,我更改了API,始终返回文件的以下标头:

content-disposition: inline; filename=FILENAME.EXTENSION

我的想法是浏览器应在浏览器中打开文件。如果无法做到这一点,它将打开一个下载弹出窗口,并使用content-disposition标头的文件名位为其指定正确的名称。如果可以在浏览器中打开文件但用户按下了下载按钮,则<a download>应该具有更高的优先级并进行下载。

问题在于,当使用<a download>下载方式时,它仍会尝试在浏览器中打开文件。我可以理解为什么,但是我希望它会尊重download属性。我正在使用Firefox,并且前端和后端在同一域上运行!

有任何线索吗?


有关一些背景信息:

我们使用ASP.NET Core 2.0。而且,如果您将内置BaseController.File()方法与fileName参数一起使用,它将强制attachment标头中的content-disposition位,使其始终下载文件。我们不希望这样,因此我们使用了File()的变体而未指定文件名,该文件名不会添加content-disposition头。效果很好...

直到我们必须支持MS Word和MS excel文件。尝试使用选项1时,用户会看到如下所示的弹出窗口:

Image of a download pop-up in firefox

如您所见,文件名丢失是因为浏览器未在content-disposition标头中发送文件名。而且我无法使用download属性来指定它,因为我按下了选项1,这意味着应该在浏览器中打开文件。如果该文件是PNG文件,则将被迫下载。

在这一点上,我尝试使用inline;filename="FILENAME.EXTENSION作为内容配置标头,但这比<a download>位具有优先权,无法达到目的。


我可以提出两种解决方法:

  • MS Word和MS Excel文件必须在其内容处理标头中有一个attachment位,因此即使您尝试直接打开它,我也可以指定文件名并下载到磁盘在浏览器中。
    • 但这并不漂亮;如果某些用户没有图像/ pdf支持并下载了图像或PDF文件,那么我的问题仍然存在,因为文件名将再次为download ...
  • 具有一个download0值的1查询参数,该参数指定是否应使用INLINE或ATTACHMENT内容处置标头下载文件。
      与我目前的情况相比,这也许更漂亮。但是还需要更多工作,我希望<a download>可以工作。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...