本章展示如何从你的 HTTP 应用中流式传输文件。以下示例不适用于 GraphQL 或微服务应用。
有时你可能需要从 REST API 向客户端返回文件。在 Nest 中通常你会这样做:
但这样做会导致你失去对控制器后拦截器逻辑的访问。要处理这种情况,你可以返回一个 StreamableFile 实例,框架会在底层自动处理响应流的管道传输。
StreamableFile 是一个封装待返回流的类。要创建新的 StreamableFile,可以向 StreamableFile 构造函数传入 Buffer 或 Stream。
StreamableFile 类可从 @nestjs/common 导入。
Fastify 默认支持直接发送文件而无需调用 stream.pipe(res),因此您完全不需要使用 StreamableFile 类。不过 Nest 在两种平台类型中都支持使用 StreamableFile,所以如果您需要在 Express 和 Fastify 之间切换,也无需担心两个引擎的兼容性问题。
您可以在下方找到一个简单示例,该示例将 package.json 作为文件而非 JSON 返回,这个思路自然可以延伸到图片、文档及其他任何文件类型。
默认的内容类型(即 HTTP 响应头 Content-Type 的值)是 application/octet-stream。如需自定义该值,您可以使用 StreamableFile 的 type 选项,或使用 res.set 方法以及 @Header() 装饰器,如下所示: