尝试在我的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调用来使其工作。但这是一个丑陋的黑客,我仍然在寻找更优雅的解决方案。
答案 0 :(得分:20)
标题不是问题。问题是您通过ajax
调用查询下载URL,该调用不会调用浏览器下载对话框。您的选择可归结为以下内容:
使用提交到您的下载网址的表单。用户不必使用可见的表单进行互动,而是使用JavaScript
创建表单,并通过调用form.submit
- Handle file download from ajax post
将window.location
指向下载网址。您可以在当前窗口中执行此操作 - download file using an ajax request或新版本 - res.download() not working in my case
答案 1 :(得分:1)
您可以尝试使用其他内容类型,以便不会在浏览器上以文本文件形式打开:
Get cat or get whatever lambda returns otherwise
另一种替代方法可以是将application / octet-stream用作mime-type,将其定义为可下载文件而无需更好的描述。
Content-Type:application/ms-excel; charset=UTF-8
答案 2 :(得分:0)
问题看起来与此类似
Show 'Save as' dialog box while downloading file from an Iframe through PHP
基本思想是Roman描述的第二个选项,但是这个选项使用iframe来实现它。