文件上传¶
为了处理文件上传,Nest 基于 Express 的multer中间件包提供了一个内置模块。
Multer 处理以multipart/form-data
格式发布的数据,该格式主要用于通过 HTTPPOST
请求上传文件。
此模块是完全可配置的,您可以根据应用程序的需求调整其行为。
Warning
Multer 不能处理不支持多部分格式的数据 (multipart/form-data
).
另外,请注意这个包不兼容
FastifyAdapter
。
为了更好的类型安全,让我们安装 Multer typings 包:
安装了这个包后,我们现在可以使用 Express.Multer.File
类型 (您可以如下方式导入该类型: import { Express } from 'express'
).
基本的例子¶
要上传单个文件,只需将FileInterceptor()
拦截器绑定到路由处理程序上,然后使用@UploadedFile()
装饰器从request
中提取 file
。
Hint
FileInterceptor()
装饰器是从@nestjs/platform-express
包导出的。
@UploadedFile()
装饰器是从@nestjs/common
导出的。
FileInterceptor()
装饰器有两个参数:
fieldName
: 字符串,它提供了保存文件的 HTML 表单中字段的名称options
: 类型为MulterOptions
的可选对象。 这是 multiter 构造函数使用的同一个对象 (更多细节在这里).
Warning
FileInterceptor()
可能不兼容第三方云提供商,如谷歌 Firebase 或其他。
文件数组¶
要上传一个文件数组(用一个字段名标识),使用FilesInterceptor()
装饰器(注意装饰器名称中的复数 Files )。
这个装饰器有三个参数:
fieldName
: 如上所述maxCount
: 可选数目,定义要接受的最大文件数目options
: 可选的MulterOptions
对象,如上所述
当使用FilesInterceptor()
时,使用@UploadedFiles()
装饰器从request
中提取文件。
Hint
FilesInterceptor()
装饰器是从@nestjs/platform-express
包中导出的。
@UploadedFiles()
装饰器是从@nestjs/common
导出的。
多个文件¶
要上传多个字段(都有不同的字段名键),请使用FileFieldsInterceptor()
装饰器。
这个装饰器有两个参数:
uploadedFields
: 一个对象数组,其中每个对象指定一个必需的name
属性和一个指定字段名称的字符串值,如前所述,以及一个可选的maxCount
属性,如前所述options
: 可选的MulterOptions
对象,如上所述
当使用FileFieldsInterceptor()
时,使用@UploadedFiles()
装饰器从request
中提取文件。
任何文件¶
要上传带有任意字段名键的所有字段,请使用AnyFilesInterceptor()
装饰器。
这个装饰器可以接受一个可选的options
对象,如上所述。
当使用AnyFilesInterceptor()
时,使用@UploadedFiles()
装饰器从request
中提取文件。
默认选项¶
您可以在上面描述的文件拦截器中指定多个选项。
要设置默认选项,你可以在导入MulterModule
时调用静态的register()
方法,传入支持的选项。
您可以使用这里列出的所有选项。
Hint
MulterModule
类是从@nestjs/platform-express
包中导出的。
异步的配置¶
当你需要异步而不是静态地设置 MulterModule
选项时,使用 registerAsync()
方法。
与大多数动态模块一样,Nest 提供了几种技术来处理异步配置。
一种方法是使用工厂函数:
像其他工厂提供程序一样,我们的工厂函数可以是async
的,并且可以通过inject
注入依赖项。
或者,你可以使用类而不是工厂来配置 MulterModule
,如下所示:
上面的构造在 MulterModule
中实例化了 MulterConfigService
,使用它来创建所需的选项对象。
注意在这个例子中,MulterConfigService
必须实现MulterOptionsFactory
接口,如下所示。
MulterModule
会在提供的类的实例化对象上调用 createMulterOptions()
方法。
如果你想重用现有的选项提供程序,而不是在 MulterModule
中创建一个私有副本,请使用 useExisting
语法。
例子¶
一个可用的例子在这里.