Javascript 如何在Node.js Express应用程序中将文件作为GET响应从远程URL发送?
上下文:带有Express的多层Node.js应用程序。前端托管为Azure网站,后端数据来自解析 我有一个GET端点,我希望用户体验是文件下载。如果该文件与我的前端位于同一台服务器中,我可以使用Javascript 如何在Node.js Express应用程序中将文件作为GET响应从远程URL发送?,javascript,node.js,http,express,Javascript,Node.js,Http,Express,上下文:带有Express的多层Node.js应用程序。前端托管为Azure网站,后端数据来自解析 我有一个GET端点,我希望用户体验是文件下载。如果该文件与我的前端位于同一台服务器中,我可以使用 res.sendfile(localPath); 但是,该文件由我的后端托管在另一台服务器上,我的前端只知道URL。所以我现在正在做: res.redirect(externalURL); 这将导致浏览器导航到资源文件URL(这是一个视频),并显示在浏览器中。我想知道的是:如何让浏览器下载该文件并
res.sendfile(localPath);
但是,该文件由我的后端托管在另一台服务器上,我的前端只知道URL。所以我现在正在做:
res.redirect(externalURL);
这将导致浏览器导航到资源文件URL(这是一个视频),并显示在浏览器中。我想知道的是:如何让浏览器下载该文件并保持在同一页面?
我在这方面已经搜索了一段时间,没有找到一种方法可以不首先将文件下载到我前端的临时文件中,这显然是我不愿意做的。这可能是HTTP 101的东西,所以我感谢任何帮助 您可以使用该函数向您的外部URL
发出请求,然后将响应返回到res
。使用pipe()
将文件通过服务器流式传输到浏览器,但在任何时候都不会将其保存到磁盘。如果您想下载该文件(而不是仅在浏览器中显示),则必须设置
下面是一个服务器的例子,它将“下载”谷歌标志。这只是使用标准的http
模块,而不是express,但其工作方式基本相同:
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);
如果您想使用该模块,则更容易:
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);
注意:浏览器将保存的文件的名称由
文件名=
部分内容处理
标题设置;在本例中,我将其设置为logo.png
用户是否会从您的链接访问此页面?在这种情况下,可以使用属性:
。否则,您将需要代理它。我正在为包含发起请求的链接的页面提供服务,我正在尝试将请求转换为下载。我使用下面Mike S描述的方法来获得我在这里寻找的UX。结果仍然是转移资产两次,虽然如此,如果有人知道如何实现这个用户体验没有双重转移,我将不胜感激。请求+管道工作得很好。我的代码如下所示:res.setHeader(“内容处置”、“附件;文件名=“+filename”);请求(videoUrl).pipe(res)代码>