内容处置:附件不触发下载对话框

我试图在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归结为以下几点:

  1. 使用提交到您的下载url的表单。 用户不必使用可见的表单,而是使用JavaScript创build表单,并通过调用form.submit编程方式提交form.submit – 从ajax post处理文件下载

  2. 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来实现它。