流媒体在处理Web应用程序中的大文件时很有用。流式传输允许您将整个文件发送到客户端之前将整个文件加载到内存之前,而是可以将其发送到小块中,提高内存效率并减少响应时间。
下面的代码段显示了使用Nestjs流式传输二进制CSV和基本64编码的PDF文件。对其他类型的文件(例如JSON文件)使用相同的方法。
设置内容类型和文件名标头,以便将文件流流并正确下载。 base64文件被转换为缓冲区并随后流式传输。从文件系统或API调用中读取文件。
import { Controller, Get, Param, Res } from '@nestjs/common';
import { Response } from 'express';
import { createReadStream } from 'fs';
import { readFile } from 'fs/promises';
import { join } from 'path';
import { Readable } from 'stream';
@Controller('templates')
export class TemplatesController {
@Get('csv')
getCsvTemplate(@Res() res: Response): void {
const file = createReadStream(join(process.cwd(), 'template.csv'));
res.set({
'Content-Type': 'text/csv',
'Content-Disposition': 'attachment; filename="template.csv"'
});
file.pipe(res);
}
@Get('pdf/:id')
async getPdfTemplate(
@Param('id') id: string,
@Res() res: Response
): Promise<void> {
const fileBase64 = await readFile(
join(process.cwd(), 'template.pdf'),
'base64'
);
// const fileBase64 = await apiCall();
const fileBuffer = Buffer.from(fileBase64, 'base64');
const fileStream = Readable.from(fileBuffer);
res.set({
'Content-Type': 'application/pdf',
'Content-Disposition': `attachment; filename="template_${id}.pdf"`
});
fileStream.pipe(res);
}
}