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

时间:2014-10-09 21:17:58

标签: javascript node.js http express

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

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

res.sendfile(localPath);

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

res.redirect(externalURL);

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

我已经在这里搜索了一段时间,如果没有先将文件下载到我前端的临时文件中,我看不到这样做的方法,我显然不会这样做。这可能是HTTP 101的东西,所以我感谢任何帮助!

1 个答案:

答案 0 :(得分:34)

您可以使用http.request()功能向externalURL发出请求,然后pipe()将回复发送回res。使用pipe()会将文件通过服务器流式传输到浏览器,但不会在任何时候将其保存到磁盘。如果您还希望下载文件(而不是仅在浏览器中显示),则必须设置content-disposition header

以下是将“下载”Google徽标的服务器示例。这只是使用标准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模块,则更容易:

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