如何在NodeJS Express中将下载的文件发送到客户端



我有一个托管文件的ftp服务器,我希望我的客户端能够通过单击前端网站上的按钮在ftp服务器上下载文件。ftp服务器是受密码保护的,但我作为管理员知道密码,用户无法知道密码,所以我使用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());
}

感谢

我认为您可以捕获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();
});
}
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());
...

最新更新