上传文件
上传文件
为了处理文件上传,Nest使用了multer中间件。此中间件是完全可配置的,您可以根据应用程序要求调整其行为。
Multer是用于处理的中间件multipart/form-data
,主要用于上传文件。
警告
Multer不会处理任何不是multipart(multipart/form-data
)的表单。此外,这个包不适用于FastifyAdapter
。
基本的例子
当我们想要上传单个文件时,我们只需绑定FileInterceptor()
到处理程序,然后file
从request
使用@UploadedFile()
装饰器中取出。
JS
@Post('upload')
@UseInterceptors(FileInterceptor('file'))
uploadFile(@UploadedFile() file) {
console.log(file
}
提示
两者FileInterceptor()
和@UploadedFile()
装饰器从@nestjs/common
包中暴露出来。
在FileInterceptor()
采用两个参数,一个fieldName
(从保持一个文件的HTML表单指向场)和可选的options
对象。这些MulterOptions
等同于传递给multer构造函数的。
文件数组
为了上传文件数组,我们使用FilesInterceptor()
。这个拦截器有三个参数。A fieldName
(保持不变),maxCount
即可以同时上载的最大文件数,以及可选MulterOptions
对象。另外,要从request
对象中选择文件,我们使用@UploadedFiles()
装饰器
JS
@Post('upload')
@UseInterceptors(FilesInterceptor('files'))
uploadFile(@UploadedFiles() files) {
console.log(files
}
提示
两者FilesInterceptor()
和@UploadedFiles()
装饰器从@nestjs/common
包中暴露出来。
多个文件
要上传多个字段(全部使用不同的键),我们使用FileFieldsInterceptor()
装饰器。
JS
@Post('upload')
@UseInterceptors(FileFieldsInterceptor([
{ name: 'avatar', maxCount: 1 },
{ name: 'background', maxCount: 1 },
]))
uploadFile(@UploadedFiles() files) {
console.log(files
}
默认选项
要自定义multer行为,您可以注册MulterModule。我们支持此处列出的所有选项。
MulterModule.register{
dest: '/upload',
}),
异步配置
通常,您可能希望异步传递模块选项,而不是事先传递它们。在这种情况下,使用registerAsync()
方法,提供了几种处理异步数据的方法。
第一种可能的方法是使用工厂功能:
MulterModule.registerAsync{
useFactory: () => {
dest: '/upload',
}),
})
显然,我们的工厂表现得像其他每一个(可能async
并且能够通过注入依赖关系inject
)。
MulterModule.registerAsync{
imports: [ConfigModule],
useFactory: async (configService: ConfigService) => {
dest: configService.getString('MULTER_DEST'),
}),
inject: [ConfigService],
})
或者,您可以使用类而不是工厂。
MulterModule.registerAsync{
useClass: MulterConfigService,
})
上面的构造将MulterConfigService
在内部实例化MulterModule
,并将利用它来创建选项对象。在MulterConfigService
必须实现MulterOptionsFactory
的接口。
@Injectable()
class MulterConfigService implements MulterOptionsFactory {
createMulterOptions(): MulterModuleOptions {
return {
dest: '/upload',
};
}
}
为了防止MulterConfigService
内部创建MulterModule
并使用从不同模块导入的提供程序,您可以使用useExisting
语法。
MulterModule.registerAsync{
imports: [ConfigModule],
useExisting: ConfigService,
})
它的作用useClass
与一个关键区别相同 - MulterModule
将查找导入的模块以重新使用已创建的ConfigService
,而不是单独实例化它。