Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/422.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在Node.js Express应用程序中将文件作为GET响应从远程URL发送?_Javascript_Node.js_Http_Express - Fatal编程技术网

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

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(这是一个视频),并显示在浏览器中。我想知道的是:如何让浏览器下载该文件并

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

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

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)