【问题标题】:How to send a downloaded file to client in NodeJS Express?如何在 NodeJS Express 中将下载的文件发送到客户端?
【发布时间】:2020-06-18 23:37:07
【问题描述】:

我有一个托管文件的 ftp 服务器,我希望我的客户能够通过单击我的前端网站上的按钮来下载 ftp 服务器上的文件。 ftp 服务器受密码保护,但我作为管理员知道密码,用户不知道密码,所以我使用 puppeteer,但问题是当用户单击按钮时,它会在服务器/后端下载将其发送给客户。我怎样才能把它传给我的客户/用户?在这种情况下,puppeteer 真的有必要吗?

这是我的代码:

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());
    }

谢谢

【问题讨论】:

    标签: node.js typescript express puppeteer


    【解决方案1】:
    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());
    ...
    

    【讨论】:

      【解决方案2】:

      我认为您可以捕获pageresponse 事件,并从响应结果对象中获取文件缓冲区,然后将缓冲区作为文件发送给客户端。

      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();
        });
      }
      

      【讨论】:

      • 不知道为什么 page.on('response') 没有触发...
      猜你喜欢
      • 2021-10-07
      • 1970-01-01
      • 2014-04-05
      • 1970-01-01
      • 2018-10-27
      • 2020-05-23
      • 2018-04-25
      • 2018-06-22
      • 2018-07-01
      相关资源
      最近更新 更多