2014-11-24 270 views
0

我试图通过Express'res.download函数将生成的文件返回到前端。我正在使用chrome,但每当我调用执行以下代码的API时,所有返回的值都与Express res.sendFile()函数返回的值相同。Express res.download()没有实际下载文件

我知道res.download使用res.sendFile,但我希望下载功能实际上保存到文件系统,而不仅仅是返回响应正文中的文件。

这是我的代码。

exports.download = function(req,res) { 
    var filePath = //somefile that I want to download 
    res.download(filePath, 'response.txt', function(err) { 
     throw err; 
    } 
} 

我知道上面的代码至少部分起作用,因为我回来了,在响应中,文件的内容。但是,我希望将它保存到文件系统中。

我误解了下载功能应该做什么?我只需要将响应数据手动写入文件系统?

+1

你是如何提出点击调用这个端点的请求的?如果请求是通过Chrome试图打开新页面,则下载的唯一方法是。通过XMLHttpRequest或类似的方式向这个端点发送请求是行不通的。 – loganfsmyth 2014-11-24 23:42:00

+0

@loganfsmyth我找不到这是为什么。你可以解释吗? – Ketcomp 2015-11-24 19:28:33

+0

当您点击一个链接时,它是发送请求的Chrome,Chrome的默认行为是下载一个文件,除非它是可以呈现的文件。当你从JS发出请求时,你的JS代码就会得到响应,并且可以随意做任何事情,所以Chrome的默认行为不会参与其中。 – loganfsmyth 2015-11-24 22:55:36

回答

1

res.download添加标题,建议浏览器该文件应该下载,而不是打开。但是,无法强制浏览器执行此操作;最终用户选择是否下载特定文件,通常情况下。

如果您使用AJAX触发此请求,那么这不会导致它被下载,因为您的JavaScript正在请求它获取数据。

我是否需要将响应数据手动写入文件系统?

您在浏览器端JavaScript中没有文件系统访问权限。我不确定你打算如何做到这一点。

+0

我将如何触发请求以使其被下载?几个月前,我没有完成我打算使用此代码的任何问题。现在尽管它不起作用。 – kkyrazis 2014-11-24 23:02:51

+0

@kkyrazis答案完全取决于请求被触发的方式。 AJAX?弹出窗口?点击链接? – 2014-11-25 01:28:42