'Is there any way to implement validation for file upload using class-validator?

I am using class-validator for validate data, I need to implement validation for file upload. Ex: file is not empty (It would be great if also implement file must be image).

I try in following way:

export class FileModel extends Model {
    @IsNotEmpty()
    file: File

    constructor(body: any) {
        super();
        const {
            file,
        } = body;

        this.file = file;
    }
}

But it's always return "file should not be empty" even I select file. is there any way to implement validation for file upload.

Thanks in advance :)



Solution 1:[1]

You can create a custom class-validator custom validation decorator:

interface IsFileOptions {
    mime: ('image/jpg' | 'image/png' | 'image/jpeg')[];
}

export function IsFile(options: IsFileOptions, validationOptions?: ValidationOptions) {
    return function (object: Object, propertyName: string) {
        return registerDecorator({
            name: 'isFile',
            target: object.constructor,
            propertyName: propertyName,
            constraints: [],
            options: validationOptions,
            validator: {
                validate(value: any, args: ValidationArguments) {
                    if (value?.mimetype && (options?.mime ?? []).includes(value?.mimetype)) {
                        return true;
                    }                        
                    return false;
                },
            }
        });
    }
}

The preceding custom decorator just checks the mime-type of the file. You can write a more sophisticated implementation and also add file size check and etc. You can use the custom-decorator like this in your DTO classes:

class UploadImageDto{
    @IsFile({ mime: ['image/jpg', 'image/png']})
    file: any;
}

Furthermore if you are using class-validator in NestJs you can use nestjs-form-data library which contains @HasMimeType, @IsFile, @MaxFileSize and more file validation decorators out of the box.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Cid