fileTypeFromBuffer 返回未定义

问题描述 投票:0回答:1

我正在构建一个无服务器应用程序,重点是使用无服务器框架在 Nestjs 中处理图像。我正在使用 multer 上传图像。

我有这个代码来验证文件:

    // required in order to use it in typescript
const { fileTypeFromBuffer } = await (eval(

      'import("file-type")',
    ) as Promise<typeof import('file-type')>);

    const fileType = await fileTypeFromBuffer(file.buffer);
    console.log('file', file);
    console.log('fileType', fileType);
    const allowedFileTypes = [
      'jpg',
      'jpeg',
      'png',
      'gif',
      'bmp',
      'webp',
      'svg',
    ];

生成以下输出:

file {
  fieldname: 'file',
  originalname: 'mickey.png',
  encoding: '7bit',
  mimetype: 'image/png',
  buffer: <Buffer c2 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 00 00 00 7d 00 00 00 64 08 06 00 00 00 c2 ab 59 3f 76 00 00 00 01 73 52 47 42 00 c2 ae c3 8e 1c c3 ... 8075 more bytes>,
  size: 8125
}
fileType undefined // <--- THIS IS THE ERROR

该文件似乎没问题,并且它也有其 mimetype,但是当尝试从缓冲区获取 fileType 时,我得到了未定义。

控制器是:

@Post('upload/image')
  @UseInterceptors(FileInterceptor('file'))
  async uploadFile(
    @UploadedFile(
      new ParseFilePipe({
        validators: [
          new MaxFileSizeValidator({ maxSize: 16214400 }), //bytes = 25 MB
          new ImageTypeValidator({}), //{ fileType: 'image/jpeg' }
        ],
      }),
    )
    file: Express.Multer.File,
  ): Promise<FileDto> {
      return await this.fileCreateUseCase.exec(loggedUser, file, flow);
  }

此外,如果我删除验证器,应用程序会尝试使用 Sharp 处理图像,这会生成不支持文件类型的错误。 所以看来缓冲区没有有效的文件类型。

我在常规项目中有完全相同的代码,并且相同的图像工作正常。所以不确定它是否与无服务器相关,或者 multer 或项目中缺少某些配置。

node.js nestjs multer sharp
1个回答
0
投票

我没有使用文件类型来检查mimetype,但我检查了模块文件

    MulterModule.registerAsync({
      useFactory: () => ({
        storage: diskStorage({
          destination: (req, file, cb) => {
            return cb(null, resolve(process.env.INVOICE_PATH));
          },
          filename: (req: any, file: any, cb: any) => {
            cb(null, `${Date.now()}_${file.originalname}`);
          },
        }),
        fileFilter: (req, file, cb) => {                      //filter here
          if (!'application/pdf'.includes(file.mimetype)) {
            cb(
              new HttpException('file is not allowed', HttpStatus.BAD_REQUEST),
              false,
            );
          }
          cb(null, true);
        },
        limits: {
          fileSize: parseInt(process.env.MAX_SIZE_PER_FILE_UPLOAD),
          files: parseInt(process.env.MAX_NUMBER_FILE_UPLOAD),
        },
      }),
    }),
© www.soinside.com 2019 - 2024. All rights reserved.