W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
注意 本章介紹如何從 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)。
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);
}
}
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: