typescript 如何使用Nestjs Pipes和FileTypeValidator验证文件类型

zed5wv10  于 2023-03-31  发布在  TypeScript
关注(0)|答案(1)|浏览(237)

我在一个控制器中实现了一个简单的Nestjs路由,用于上传文件。文件是用Multer处理的。因为它的目的是编辑用户的个人资料图片,所以我需要验证文件是一个图像。但是由于某种原因,我不能用FileTypeValidator运行它。上传的文件每次都被拒绝。

@UseInterceptors(
  FileInterceptor('file', {
    storage: MulterService.getStorage((req, file, cb) => {
      const filename = `${uuidv4()}`;
      const extension = path.parse(file.originalname).ext;

      cb(null, `${filename}${extension}`);
    }, MulterService.destinations.profilePictures),
  })
)
@Post('profile-picture')
editProfilePicture(
  @UploadedFile(
    new ParseFilePipe({
      validators: [new FileTypeValidator({ fileType: 'png' })],
      // png files always denied
      // /\^(jpeg|jpg|png|gif)$/ regex isn't working either
    })
  )
  file: Express.Multer.File
): Promise<User> {
  // ...
}
7d7tgy0s

7d7tgy0s1#

我测试了你的正则表达式模式,它似乎与你提供的图像扩展名不匹配,而是假设开头总是有点字符。所以我所做的是从正则表达式中删除前两个字符\.,它可以工作。下面是最终的正则表达式:(jpeg|jpg|png|gif)$

编辑可通过ParseFilePipe或ParseFilePipeBuilder验证管道进行验证ParseFilePipe

@UploadedFile(
    new ParseFilePipe({
      validators: [
        new MaxFileSizeValidator({ maxSize: max size of file in bytes }),
        new FileTypeValidator({ fileType: /\.(jpg|jpeg|png)$/ }),
      ],
    }),
  )
  file: Express.Multer.File

ParseFilePipeBuilder

@UploadedFile(
    new ParseFilePipeBuilder()
      .addFileTypeValidator({
        fileType: /\.(jpg|jpeg|png)$/,
      })
      .addMaxSizeValidator({
        maxSize: max size of file in bytes
      })
      .build({
        // Custome Message???
        errorHttpStatusCode: HttpStatus.UNPROCESSABLE_ENTITY
      }),
  )
  file: Express.Multer.File

相关问题