Как отправить скачанный файл клиенту в NodeJS Express? - PullRequest
1 голос
/ 06 марта 2020

У меня есть ftp-сервер, на котором размещены файлы. Я хочу, чтобы мои клиенты могли загружать файлы на ftp-сервер, нажимая кнопку на моем интерфейсном веб-сайте. FTP-сервер защищен паролем, но я, как администратор, знаю пароль, пользователь не может знать пароль, поэтому я использую кукловод, но проблема в том, что когда пользователь нажимает кнопку, он загружает на сервер / сервер отправить его клиенту. Как я могу передать это моему клиенту / пользователю? Действительно ли в этом деле нужен кукловод?

Вот мой код:

async downloadFile(req: Request, res: Response, next: NextFunction) {
        //const file_id = req.params.file_id;
        async function run() {
            const browser = await puppeteer.launch({headless: false});
            const page = await browser.newPage();
            await page.authenticate({username:"user", password:"password"});
            await page.goto('http://ftpserver/remote.php/webdav/filename.rar');
            browser.close()
            return page
        }
        res.setHeader('Content-type', 'application/x-rar-compressed');
        res.send(run());
    }

Спасибо

Ответы [ 2 ]

2 голосов
/ 06 марта 2020

Я думаю, что вы можете перехватить response событие page и получить файловый буфер из объекта результата ответа, а затем отправить буфер клиенту в виде файла.

async downloadFile(req: Request, res: Response, next: NextFunction) {
  //const file_id = req.params.file_id;
  const browser = await puppeteer.launch({ headless: false });
  const page = await browser.newPage();
  await page.authenticate({ username: "user", password: "password" });
  await page.goto('http://ftpserver/remote.php/webdav/filename.rar');

  page.on('response', async (response) => {
    if (response.url().indexOf('.rar') != -1) { // is resource what you want
      const buffer = await response.buffer(); // get response buff - file buffer
      res.setHeader('Content-Disposition', 'attachment; filename=filename.rar'); // set filename for client download process
      res.setHeader('Content-Transfer-Encoding', 'binary');
      res.setHeader('Content-Type', 'application/octet-stream');
      res.send(Buffer.from(buffer, 'binary'));
    }
    browser.close();
  });
}
1 голос
/ 06 марта 2020
import { PassThrough } from "stream";
import { ServerResponse } from "http";

function responseStream(serverResponse: ServerResponse, data)
{
    let readStream = new PassThrough();
    readStream.end(data);
    return readStream.pipe(serverResponse);
}

...
responseStream(res, await run());
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...