微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我有一个GET端点,我希望用户体验是一个文件下载.如果文件与我的前端居住在同一台服务器上,我可以使用

res.sendfile(localPath);

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

res.redirect(externalURL);

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

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

解决方法

您可以使用 http.request()功能向externalURL发出请求,然后再将该响应发回到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);

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐