上下文:具有Express的多层Node.js应用程序。前端托管为Azure网站,后端数据来自Parse。
我有一个GET端点,并且希望用户体验是文件下载。如果文件与前端位于同一服务器上,则可以使用
res.sendfile(localPath);
但是,该文件由我的后端托管在另一台服务器上,而我的前端只知道URL。所以我目前正在做:
res.redirect(externalURL);
这导致浏览器导航到资产文件URL(视频),并显示在浏览器中。我想知道的是: 如何让浏览器下载该文件,而只停留在同一页面上?
我已经搜索了一段时间,如果没有先将文件下载到前端的临时文件中,我就看不到这样做的方法,而我显然不愿意这样做。这可能是HTTP 101的东西,因此,我感谢任何帮助!
您可以使用http.request()函数向发出请求externalURL,然后pipe()将响应返回给res。使用pipe()将通过服务器将文件流式传输到浏览器,但在任何时候都不会将其保存到磁盘。如果您还希望下载文件(而不是仅显示在浏览器中),则必须设置content- dispositionheader。
http.request()
externalURL
pipe()
res
content- disposition
这是一个将“下载” Google徽标的服务器的示例。这只是使用标准http模块,而不是表达模块,但是它的工作方式基本相同:
http
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模块,则更加简单:
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);
注意: 浏览器将保存的文件名由标题的filename=一部分设置content- disposition;在这种情况下,我将其设置为logo.png。
filename=
logo.png