首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

上传文件

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

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

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

基本的例子

当我们想要上传单个文件时,我们只需绑定FileInterceptor()到处理程序,然后filerequest使用@UploadedFile()装饰器中取出。

JS

代码语言:javascript
复制
@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

代码语言:javascript
复制
@Post('upload')
@UseInterceptors(FilesInterceptor('files'))
uploadFile(@UploadedFiles() files) {
  console.log(files);
}

提示两者FilesInterceptor()@UploadedFiles()装饰器从@nestjs/common包中暴露出来。

多个文件

要上传多个字段(全部使用不同的键),我们使用FileFieldsInterceptor()装饰器。

JS

代码语言:javascript
复制
@Post('upload')
@UseInterceptors(FileFieldsInterceptor([
  { name: 'avatar', maxCount: 1 },
  { name: 'background', maxCount: 1 },
]))
uploadFile(@UploadedFiles() files) {
  console.log(files);
}

默认选项

要自定义multer行为,您可以注册MulterModule。我们支持此处列出的所有选项。

代码语言:javascript
复制
MulterModule.register({
  dest: '/upload',
}),

异步配置

通常,您可能希望异步传递模块选项,而不是事先传递它们。在这种情况下,使用registerAsync()方法,提供了几种处理异步数据的方法。

第一种可能的方法是使用工厂功能:

代码语言:javascript
复制
MulterModule.registerAsync({
  useFactory: () => ({
    dest: '/upload',
  }),
})

显然,我们的工厂表现得像其他每一个(可能async并且能够通过注入依赖关系inject)。

代码语言:javascript
复制
MulterModule.registerAsync({
  imports: [ConfigModule],
  useFactory: async (configService: ConfigService) => ({
    dest: configService.getString('MULTER_DEST'),
  }),
  inject: [ConfigService],
})

或者,您可以使用类而不是工厂。

代码语言:javascript
复制
MulterModule.registerAsync({
  useClass: MulterConfigService,
})

上面的构造将MulterConfigService在内部实例化MulterModule,并将利用它来创建选项对象。在MulterConfigService必须实现MulterOptionsFactory的接口。

代码语言:javascript
复制
@Injectable()
class MulterConfigService implements MulterOptionsFactory {
  createMulterOptions(): MulterModuleOptions {
    return {
      dest: '/upload',
    };
  }
}

为了防止MulterConfigService内部创建MulterModule并使用从不同模块导入的提供程序,您可以使用useExisting语法。

代码语言:javascript
复制
MulterModule.registerAsync({
  imports: [ConfigModule],
  useExisting: ConfigService,
})

它的作用useClass与一个关键区别相同 - MulterModule将查找导入的模块以重新使用已创建的ConfigService,而不是单独实例化它。

扫码关注腾讯云开发者

领取腾讯云代金券