NestJS 流式處理文件

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

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

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

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

Streamable File 類

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

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

跨平臺支持

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

示例

可以在下面找到一個將 package.json 作為文件而不是 JSON 返回的簡單示例,但這個想法自然地擴展到圖像、文檔和任何其他文件類型。

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)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號