NestJS 流式處理文件

2023-09-08 17:41 更新
注意 本章介紹如何從 HTTP 應(yīng)用程序流式傳輸文件。 下面給出的示例不適用于 GraphQL 或微服務(wù)應(yīng)用程序。

有時(shí)我們可能希望將文件從 REST API 發(fā)送回客戶端。 要使用 Nest 執(zhí)行此操作,通常會(huì)執(zhí)行以下操作:

@Controller('file')
export class FileController {
  @Get()
  getFile(@Res() res: Response) {
    const file = createReadStream(join(process.cwd(), 'package.json'));
    file.pipe(res);
  }
}

但是這樣做你最終會(huì)失去對(duì)你的后控制器攔截器邏輯的訪問(wèn)。 為了處理這個(gè)問(wèn)題,你可以返回一個(gè) StreamableFile 實(shí)例,并且在底層,框架將負(fù)責(zé)處理響應(yīng)。

Streamable File 類

StreamableFile 是一個(gè)保存要返回的流的類。 要?jiǎng)?chuàng)建新的 StreamableFile,我們可以將 Buffer 或 Stream 傳遞給 StreamableFile 構(gòu)造函數(shù)。

StreamableFile 類可以從@nestjs/common 導(dǎo)入。

跨平臺(tái)支持

默認(rèn)情況下,F(xiàn)astify 可以支持發(fā)送文件,無(wú)需調(diào)用 stream.pipe(res) ,所以你根本不需要使用 StreamableFile 類。 但是,Nest 支持在這兩種平臺(tái)類型中使用 StreamableFile,因此如果我們最終在 Express 和 Fastify 之間切換,則無(wú)需擔(dān)心兩種引擎之間的兼容性。

示例

可以在下面找到一個(gè)將 package.json 作為文件而不是 JSON 返回的簡(jiǎn)單示例,但這個(gè)想法自然地?cái)U(kuò)展到圖像、文檔和任何其他文件類型。

import { Controller, Get, StreamableFile } from '@nestjs/common';
import { createReadStream } from 'fs';
import { join } from 'path';

@Controller('file')
export class FileController {
  @Get()
  getFile(): StreamableFile {
    const file = createReadStream(join(process.cwd(), 'package.json'));
    return new StreamableFile(file);
  }
}

默認(rèn)內(nèi)容類型是 application/octet-stream ,如果需要自定義響應(yīng)可以使用 res.set 方法。

import { Controller, Get, StreamableFile, Response } from '@nestjs/common';
import { createReadStream } from 'fs';
import { join } from 'path';

@Controller('file')
export class FileController {
  @Get()
  getFile(@Response({ passthrough: true }) res): StreamableFile {
    const file = createReadStream(join(process.cwd(), 'package.json'));
    res.set({
      'Content-Type': 'application/json',
      'Content-Disposition': 'attachment; filename="package.json"',
    });
    return new StreamableFile(file);
  }
}


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)