如何解决如何在具有内容处置嵌入式标题的情况下强制<a download>下载文件
更新:我已经得出结论,这是一个Firefox问题。 Chrome,Chromium Edge和Safari都可以与我的解决方案完美配合。我在firefox bugtracker上创建了一个错误:https://bugzilla.mozilla.org/show_bug.cgi?id=1658877
我有一个前端,可以通过两种方式下载文件:
- 单击按钮1在浏览器中打开文件
- 单击按钮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时,用户会看到如下所示的弹出窗口:
如您所见,文件名丢失是因为浏览器未在content-disposition标头中发送文件名。而且我无法使用download
属性来指定它,因为我按下了选项1,这意味着应该在浏览器中打开文件。如果该文件是PNG文件,则将被迫下载。
在这一点上,我尝试使用inline;filename="FILENAME.EXTENSION
作为内容配置标头,但这比<a download>
位具有优先权,无法达到目的。
我可以提出两种解决方法:
- MS Word和MS Excel文件必须在其内容处理标头中有一个
attachment
位,因此即使您尝试直接打开它,我也可以指定文件名并下载到磁盘在浏览器中。- 但这并不漂亮;如果某些用户没有图像/ pdf支持并下载了图像或PDF文件,那么我的问题仍然存在,因为文件名将再次为
download
...
- 但这并不漂亮;如果某些用户没有图像/ pdf支持并下载了图像或PDF文件,那么我的问题仍然存在,因为文件名将再次为
- 具有一个
download
或0
值的1
查询参数,该参数指定是否应使用INLINE或ATTACHMENT内容处置标头下载文件。-
与我目前的情况相比,这也许更漂亮。但是还需要更多工作,我希望
<a download>
可以工作。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。