上传文件

上传文件

为了处理文件上传,Nest使用了multer中间件。此中间件是完全可配置的,您可以根据应用程序要求调整其行为。

Multer是用于处理的中间件multipart/form-data,主要用于上传文件。

警告Multer不会处理任何不是multipart(multipart/form-data)的表单。此外,这个包不适用于FastifyAdapter

基本的例子

当我们想要上传单个文件时,我们只需绑定FileInterceptor()到处理程序,然后filerequest使用@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,而不是单独实例化它。