Bird
Raised Fist0
NestJSframework~5 mins

File validation pipe in NestJS

Choose your learning style10 modes available
Introduction

A file validation pipe checks uploaded files to make sure they are safe and correct before your app uses them.

When users upload images and you want to allow only certain types like PNG or JPG.
When you want to limit the file size to prevent very large uploads.
When you need to check the file format before saving it to your server.
When you want to reject files that do not meet your rules early in the request.
When you want to give clear error messages if the file is not valid.
Syntax
NestJS
import { PipeTransform, Injectable, BadRequestException } from '@nestjs/common';

@Injectable()
export class FileValidationPipe implements PipeTransform {
  transform(file: any) {
    // validation logic here
    if (!file) {
      throw new BadRequestException('No file uploaded');
    }
    if (!['image/png', 'image/jpeg'].includes(file.mimetype)) {
      throw new BadRequestException('Invalid file type');
    }
    if (file.size > 1_000_000) { // 1MB limit
      throw new BadRequestException('File too large');
    }
    return file;
  }
}

The transform method runs automatically on the input before your controller gets it.

Throwing BadRequestException stops the request and sends an error to the user.

Examples
Simple check to make sure a file was uploaded.
NestJS
transform(file: any) {
  if (!file) {
    throw new BadRequestException('No file uploaded');
  }
  return file;
}
Check that the file is either PNG or JPEG.
NestJS
transform(file: any) {
  const allowedTypes = ['image/png', 'image/jpeg'];
  if (!allowedTypes.includes(file.mimetype)) {
    throw new BadRequestException('Invalid file type');
  }
  return file;
}
Limit file size to 2 megabytes.
NestJS
transform(file: any) {
  const maxSize = 2_000_000; // 2MB
  if (file.size > maxSize) {
    throw new BadRequestException('File too large');
  }
  return file;
}
Sample Program

This controller accepts a file upload at POST /upload. It uses the FileValidationPipe to check the file before saving. If the file is valid, it returns a success message with the file name.

NestJS
import { Controller, Post, UploadedFile, UseInterceptors } from '@nestjs/common';
import { FileInterceptor } from '@nestjs/platform-express';
import { FileValidationPipe } from './file-validation.pipe';

@Controller('upload')
export class UploadController {
  @Post()
  @UseInterceptors(FileInterceptor('file'))
  uploadFile(@UploadedFile(new FileValidationPipe()) file: Express.Multer.File) {
    return { message: 'File uploaded successfully', filename: file.originalname };
  }
}
OutputSuccess
Important Notes

Make sure your file upload setup (like Multer) matches the pipe's expected file object.

Customize validation rules to fit your app's needs.

Use clear error messages to help users fix upload problems.

Summary

File validation pipes check uploaded files early to keep your app safe.

They can check file type, size, and presence.

Throwing exceptions stops bad files and sends helpful errors.

Practice

(1/5)
1. What is the main purpose of a FileValidationPipe in NestJS?
easy
A. To upload files to a cloud storage service
B. To convert files into JSON format automatically
C. To check uploaded files for type, size, and presence before processing
D. To compress files before saving them

Solution

  1. Step 1: Understand the role of validation pipes in NestJS

    Validation pipes are used to check and validate incoming data before it reaches the controller logic.
  2. Step 2: Apply this to file uploads

    A FileValidationPipe specifically checks uploaded files for correct type, size, and presence to prevent bad data.
  3. Final Answer:

    To check uploaded files for type, size, and presence before processing -> Option C
  4. Quick Check:

    File validation = check file properties [OK]
Hint: Validation pipes check data early to keep apps safe [OK]
Common Mistakes:
  • Thinking pipes upload or transform files
  • Confusing validation with file storage
  • Assuming pipes compress files automatically
2. Which of the following is the correct way to apply a file validation pipe to a file upload in a NestJS controller?
easy
A. @UsePipes(new FileValidationPipe()) uploadFile(@UploadedFile() file: Express.Multer.File) {}
B. @UseGuards(new FileValidationPipe()) uploadFile(@UploadedFile() file: Express.Multer.File) {}
C. @UseFilters(new FileValidationPipe()) uploadFile(@UploadedFile() file: Express.Multer.File) {}
D. @UseInterceptors(new FileValidationPipe()) uploadFile(@UploadedFile() file: Express.Multer.File) {}

Solution

  1. Step 1: Identify the correct decorator for validation pipes

    In NestJS, validation pipes are applied using the @UsePipes() decorator.
  2. Step 2: Match the usage with file upload

    The FileValidationPipe is a pipe, so it must be passed inside @UsePipes() to validate the uploaded file.
  3. Final Answer:

    @UsePipes(new FileValidationPipe()) uploadFile(@UploadedFile() file: Express.Multer.File) {} -> Option A
  4. Quick Check:

    Validation pipe = @UsePipes() [OK]
Hint: Use @UsePipes() for validation pipes, not guards or filters [OK]
Common Mistakes:
  • Using @UseGuards or @UseFilters instead of @UsePipes
  • Applying pipes without instantiating them
  • Confusing interceptors with pipes
3. Given this pipe code snippet, what will happen if a user uploads a file larger than 1MB?
export class FileValidationPipe implements PipeTransform {
  transform(file: Express.Multer.File) {
    if (!file) throw new BadRequestException('File is required');
    if (file.size > 1_000_000) throw new BadRequestException('File too large');
    return file;
  }
}
medium
A. The pipe ignores the size and processes the file
B. The pipe accepts the file and returns it
C. The pipe throws a NotFoundException
D. The pipe throws a BadRequestException with message 'File too large'

Solution

  1. Step 1: Analyze the size check in the transform method

    The pipe checks if file.size is greater than 1,000,000 bytes (1MB).
  2. Step 2: Understand the exception thrown on size violation

    If the file is too large, it throws BadRequestException('File too large'), stopping the request.
  3. Final Answer:

    The pipe throws a BadRequestException with message 'File too large' -> Option D
  4. Quick Check:

    File size > 1MB = BadRequestException [OK]
Hint: Check exception messages in transform() for validation errors [OK]
Common Mistakes:
  • Assuming the pipe accepts large files
  • Confusing BadRequestException with NotFoundException
  • Ignoring the file presence check
4. Identify the error in this file validation pipe code:
export class FileValidationPipe implements PipeTransform {
  transform(file: Express.Multer.File) {
    if (!file) throw new BadRequestException('File is required');
    if (file.mimetype !== 'image/png' || file.mimetype !== 'image/jpeg') {
      throw new BadRequestException('Invalid file type');
    }
    return file;
  }
}
medium
A. The mimetype check always throws because of incorrect logical operator
B. The file presence check is missing
C. The pipe does not return the file
D. The exception type is incorrect

Solution

  1. Step 1: Examine the mimetype condition

    The condition uses || (OR) between two checks: file.mimetype !== 'image/png' OR file.mimetype !== 'image/jpeg'.
  2. Step 2: Understand why this always triggers

    Because a file cannot be both 'image/png' and 'image/jpeg' at the same time, one of these will always be true, causing the exception every time.
  3. Final Answer:

    The mimetype check always throws because of incorrect logical operator -> Option A
  4. Quick Check:

    Use AND (&&) to check mimetype correctly [OK]
Hint: Use && to check if mimetype is neither png nor jpeg [OK]
Common Mistakes:
  • Using || instead of && in mimetype checks
  • Forgetting to return the file after validation
  • Throwing wrong exception types
5. You want to create a file validation pipe that only accepts PDF files smaller than 2MB and throws a clear error if validation fails. Which of the following code snippets correctly implements this?
hard
A. export class PdfValidationPipe implements PipeTransform { transform(file: Express.Multer.File) { if (!file) throw new BadRequestException('File is required'); if (file.mimetype === 'application/pdf') throw new BadRequestException('Only PDFs allowed'); if (file.size > 2_000_000) throw new BadRequestException('File too large'); return file; } }
B. export class PdfValidationPipe implements PipeTransform { transform(file: Express.Multer.File) { if (!file) throw new BadRequestException('File is required'); if (file.mimetype !== 'application/pdf') throw new BadRequestException('Only PDFs allowed'); if (file.size >= 2_000_000) throw new BadRequestException('File too large'); return file; } }
C. export class PdfValidationPipe implements PipeTransform { transform(file: Express.Multer.File) { if (!file) throw new BadRequestException('File is required'); if (file.mimetype !== 'application/pdf' && file.size > 2_000_000) throw new BadRequestException('Invalid file'); return file; } }
D. export class PdfValidationPipe implements PipeTransform { transform(file: Express.Multer.File) { if (!file) throw new BadRequestException('File is required'); if (file.mimetype !== 'application/pdf' || file.size > 2_000_000) throw new BadRequestException('Invalid file'); return file; } }

Solution

  1. Step 1: Verify correct logic for presence and mimetype

    Check if (!file) throw, then if (file.mimetype !== 'application/pdf') throw 'Only PDFs allowed'. Uses !== to reject non-PDFs.
  2. Step 2: Separate size check for smaller than 2MB

    if (file.size >= 2_000_000) throw 'File too large'. Uses >= to reject 2MB or larger.
  3. Step 3: Eliminate distractors

    B throws if PDF; C's && accepts non-PDF if small; D's > accepts exactly 2MB.
  4. Final Answer:

    export class PdfValidationPipe implements PipeTransform { transform(file: Express.Multer.File) { if (!file) throw new BadRequestException('File is required'); if (file.mimetype !== 'application/pdf') throw new BadRequestException('Only PDFs allowed'); if (file.size >= 2_000_000) throw new BadRequestException('File too large'); return file; } } -> Option B
  5. Quick Check:

    !== mimetype, >= size, separate ifs [OK]
Hint: Check each condition separately with !== and clear exceptions [OK]
Common Mistakes:
  • Using === instead of !== for mimetype check
  • Combining conditions incorrectly with && or ||
  • Not throwing specific error messages
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard