如何在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
。
- Node.js Body-Parser无法检索表单input
- Rest API Node Js&Express,创build链接(href)给自己
- jQuery ajax post在Node + Express的JSON响应上生成“Unexpected token:”
- 如何从App Engine获得真正的请求客户端的IP
- NodeJS / express – 公共API端点的安全性
- 我是一个完整的新手,我如何学习Node.Js + Express + MongoDB?
- 在JADE中访问jQuery对象
- 错误:ENOENT:没有这样的文件或目录,打开“./views/s.ejs”Nodejs Express
- SequelizeBaseError:列“…”不存在