res.download() 在我的情况下不起作用

Posted

技术标签:

【中文标题】res.download() 在我的情况下不起作用【英文标题】:res.download() not working in my case 【发布时间】:2013-12-09 05:30:16 【问题描述】:

我正在使用 nodejs 和 expressjs 框架从服务器下载文件 'jsonFile.json'。

我正在使用以下代码

res.get('/download', function(req, res) 
         res.setHeader('Content-disposition', 'attachment; filename=jsonFile.json');
          res.setHeader('Content-Type', 'text/json');
          res.download(__dirname + 'jsonFile.json');
        
      );

但这会导致响应包含文件的全部内容。

我期待浏览器要求我将文件保存在本地磁盘中。

我如何将文件保存在本地磁盘中。???

【问题讨论】:

【参考方案1】:

让 Express 设置正确的标题,然后这样做:

res.get('/download', function(req, res) 
  res.download(__dirname + 'jsonFile.json', 'jsonFile.json');
);

(doc)

编辑:由于您通过 AJAX 调用请求 /download,因此您必须更改设置,因为大多数(所有?)浏览器在这种情况下都不会显示下载对话框。

相反,您可以从前端代码创建一个新窗口来触发对话框:

window.open('/download?foo=bar&xxx=yyy');

【讨论】:

如果我删除路径名中的“/”..我得到 404 是的,我已经删除了标题,结果是一样的,但我仍然没有得到预期的结果。浏览器应该要求将文件保存在磁盘上, @Koka 哪个浏览器?它适用于我的 Chrome、FF 和 Safari。另外,你是直接打开/download,还是通过AJAX之类的? 我的意思是一样的..我已经添加了他 res.get('/download' ... 行但结果是一样的..得到充满文件内容的响应。 @robertklep 感谢 window.open 为我工作。但我面临一个新问题。我的服务发送一个 zip 文件作为响应。但在我的情况下,只下载了一个空的 zip 文件【参考方案2】:

只是为了确认@robert 所说的,

因为这件事让我头晕了两天, 不要使用 ajax 调用,而是使用您的 ajax 请求位置打开一个新窗口,例如:

window.open("http://yourserver.com/api/link?a=3&b=4")

希望这对某人有所帮助。

【讨论】:

以上是关于res.download() 在我的情况下不起作用的主要内容,如果未能解决你的问题,请参考以下文章

为啥 `async/await` 在我的情况下不起作用?

Laravel 雄辩的关系在我的情况下不起作用[重复]

:CSS中的NOT选择器在我的情况下不起作用[重复]

多个 OpenGL 纹理在某些情况下不起作用?

按钮的填充在没有背景的情况下不起作用

AJAX 功能在没有警报的情况下不起作用