尝试在我的NodeJS服务器上创建文件下载功能时,我遇到了一些意外的行为。
我有一个REST(快速)API,它需要一些导出数据功能,它在服务器上创建一个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上都尝试过。两者都存在问题。
有任何想法吗?
更新
我设法通过创建一个虚拟表单,并使用其提交操作来进行我的AJAX调用。但这是一个丑陋的黑客,我仍然在寻找一个更优雅的解决方案。
标题不是问题。问题是你正在通过一个查询下载URL ajax
调用,不会调用浏览器下载对话框。您的选择归结为以下内容:
使用提交到您的下载URL的表单。用户不必使用可见的表单进行交互,而是创建表单 JavaScript
并通过调用以编程方式提交 form.submit
- 处理从ajax帖子下载的文件
点 window.location
到下载网址。你可以在当前窗口中执行此操作 - 使用ajax请求下载文件 或者是新的 - res.download()在我的情况下不起作用
标题不是问题。问题是你正在通过一个查询下载URL ajax
调用,不会调用浏览器下载对话框。您的选择归结为以下内容:
使用提交到您的下载URL的表单。用户不必使用可见的表单进行交互,而是创建表单 JavaScript
并通过调用以编程方式提交 form.submit
- 处理从ajax帖子下载的文件
点 window.location
到下载网址。你可以在当前窗口中执行此操作 - 使用ajax请求下载文件 或者是新的 - res.download()在我的情况下不起作用
您可以尝试使用不同的内容类型,以便不会在浏览器上作为文本文件打开:
Content-Type:application/ms-excel; charset=UTF-8
另一种替代方法可以是将application / octet-stream用作mime-type,将其定义为可下载文件而无需更好的描述。
Content-Type:application/octet-stream; charset=UTF-8
问题看起来与此类似
通过PHP从Iframe下载文件时显示“另存为”对话框
基本思想是Roman描述的第二个选项,但是这个选项使用iframe来实现它。