如何在Node.js Express应用程序中将来自远程URL的文件作为GET响应发送?

上下文:使用Express的多层Node.js应用程序。 前端作为Azure网站托pipe,后端数据来自Parse。

我有一个GET端点,我希望用户体验是一个文件下载。 如果该文件与我的前端位于同一台服务器上,则可以使用

res.sendfile(localPath); 

然而,该文件是由我的后端托pipe在另一台服务器上,我的前端知道的是URL。 所以我现在正在做:

 res.redirect(externalURL); 

这导致浏览器导航到资产文件URL(这是一个video),并显示在浏览器中。 我想知道的是: 如何让浏览器下载该文件,而只是停留在同一页面?

我在这里search了一段时间,没有先将文件下载到我的前端的临时文件,我不明白这样做的方式,我显然不这样做。 这可能是HTTP 101的东西,所以我感谢任何帮助!

您可以使用http.request()函数向您的externalURL发出请求,然后将响应传回给res 。 使用pipe()将通过服务器将文件stream式传输到浏览器,但是在任何时候都不会将其保存到磁盘。 如果你想要下载文件(而不是只显示在浏览器中),你将不得不设置content-disposition标题 。

这里是一个将“下载”谷歌标志的服务器的例子。 这只是使用标准的http模块而不是expression,但它应该基本上以相同的方式工作:

 var http = require('http'); http.createServer(function(req, res) { var externalReq = http.request({ hostname: "www.google.com", path: "/images/srpr/logo11w.png" }, function(externalRes) { res.setHeader("content-disposition", "attachment; filename=logo.png"); externalRes.pipe(res); }); externalReq.end(); }).listen(8080); 

如果你想使用request模块,那更容易:

 var http = require('http'), request = require('request'); http.createServer(function(req, res) { res.setHeader("content-disposition", "attachment; filename=logo.png"); request('http://google.com/images/srpr/logo11w.png').pipe(res); }).listen(8080); 

注意:浏览器将保存的文件的名称由content-disposition标头的filename=部分content-disposition ; 在这种情况下,我把它设置为logo.png