内容处置:附件不触发下载对话框
我试图在NodeJS服务器上创build文件下载function时,遇到了一些意外的行为。 我有一个REST(express)API调用一些导出数据函数,它在服务器上创build一个CSV文件,并使用res.download('path/to/file')
来触发下载。 响应标头包括
Content-Disposition:attachment; filename="indicators.csv" Content-Length:30125 Content-Type:text/csv; charset=UTF-8
所以一切似乎都是有序的
问题是,我从服务器获取纯文本的响应。 响应包含CSV文件包含的所有数据,但不会像我打算的那样触发浏览器的文件下载对话框。 我尝试了Chrome和FF。 这个问题依然存在。
有任何想法吗?
更新
我设法通过创build一个虚拟表单,并使用其提交动作来完成我的AJAX调用。 但这是一个丑陋的黑客,我仍然在寻找一个更优雅的解决scheme。
标题不是问题。 问题是你通过ajax
调用来查询下载url,这个调用不会调用浏览器下载对话框。 你的select归结为以下几点:
-
使用提交到您的下载url的表单。 用户不必使用可见的表单,而是使用
JavaScript
创build表单,并通过调用form.submit
编程方式提交form.submit
– 从ajax post处理文件下载 -
将
window.location
指向下载url。 您可以在当前窗口中执行此操作 – 使用ajax请求下载文件 ,或使用新的文件 – res.download()不适用于我的情况
您可以尝试使用不同的内容types,以便在浏览器中不会打开为文本文件:
Content-Type:application/ms-excel; charset=UTF-8
另一种方法是使用application / octet-stream作为MIMEtypes来定义它作为一个可下载的文件,没有更好的描述。
Content-Type:application/octet-stream; charset=UTF-8
这个问题看起来类似于这个
在通过PHP从Iframe下载文件时显示“另存为”对话框
基本的想法是上面罗马描述的第二个选项,但是这个使用iframe来实现它。