Как отправить файл с удаленного URL как ответ GET в приложении Node.js Express?

Контекст: многоуровневое Node.js приложение с Express. Front end, размещенный как веб-сайт Azure, возвращает данные из Parse.

У меня есть конечная точка GET, и я хочу, чтобы пользовательская загрузка была загружена. Если файл жил на том же сервере, что и мой внешний интерфейс, я мог бы использовать

res.sendfile(localPath);

Тем не менее, файл размещается моей задней частью на другом сервере, и все мои интерфейсы - это URL. Итак, я сейчас делаю:

res.redirect(externalURL);

В результате браузер переходит к URL-адресу файла ресурса (который является видео) и отображается в браузере. Я хочу знать следующее: как заставить браузер загружать этот файл и оставаться на одной странице?

Я искал вокруг какое-то время, и я не вижу способа сделать это, не загружая сначала файл во временный файл на моем лицевом конце, чего я, очевидно, не делал. Это, вероятно, HTTP 101, поэтому я ценю любую помощь!

Ответ 1

Вы можете использовать функцию http.request(), чтобы отправить запрос на ваш externalURL, а затем pipe() ответ обратно на res. Использование pipe() будет передавать файл через ваш сервер в браузер, но в любой момент он не сохранит его на диске. Если вы хотите, чтобы файл также был загружен (вместо того, чтобы отображаться в браузере), вам нужно будет установить заголовок content-disposition.

Вот пример сервера, который будет "загружать" логотип 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.