Bird
Raised Fist0
FastAPIframework~8 mins

File validation (size, type) in FastAPI - Performance & Optimization

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Performance: File validation (size, type)
MEDIUM IMPACT
This affects page load speed and interaction responsiveness by preventing large or invalid files from being processed or uploaded.
Validating uploaded files for size and type in a FastAPI endpoint
FastAPI
from fastapi import FastAPI, File, UploadFile, HTTPException

app = FastAPI()

MAX_SIZE = 5_000_000

@app.post('/upload')
async def upload_file(file: UploadFile = File(...)):
    if not file.content_type.startswith('image/'):
        raise HTTPException(status_code=400, detail='Invalid file type')
    size = 0
    async for chunk in file.file:
        size += len(chunk)
        if size > MAX_SIZE:
            raise HTTPException(status_code=400, detail='File too large')
    # reset file pointer if needed
    file.file.seek(0)
    # process file
    return {'message': 'File accepted'}
Validates file type immediately and checks size incrementally while streaming, avoiding loading entire file into memory.
📈 Performance GainReduces memory usage and prevents blocking, improving INP and server responsiveness.
Validating uploaded files for size and type in a FastAPI endpoint
FastAPI
from fastapi import FastAPI, File, UploadFile

app = FastAPI()

@app.post('/upload')
async def upload_file(file: UploadFile = File(...)):
    contents = await file.read()
    if len(contents) > 5_000_000:
        return {'error': 'File too large'}
    if not file.content_type.startswith('image/'):
        return {'error': 'Invalid file type'}
    # process file
    return {'message': 'File accepted'}
Reads the entire file into memory before validating size and type, causing high memory use and blocking responsiveness for large files.
📉 Performance CostBlocks event loop during file read, increasing INP and memory usage for large files.
Performance Comparison
PatternMemory UsageBlocking TimeResponsivenessVerdict
Read full file before validationHigh (loads entire file)Blocks event loop during readLow (slow response for large files)[X] Bad
Stream file and validate incrementallyLow (only chunks in memory)Non-blocking with async iterationHigh (fast rejection of invalid files)[OK] Good
Rendering Pipeline
File validation in FastAPI happens server-side before processing or storing the file, preventing heavy operations on invalid files.
Network Transfer
Server Processing
Response Time
⚠️ BottleneckServer Processing when reading large files fully before validation
Core Web Vital Affected
INP
This affects page load speed and interaction responsiveness by preventing large or invalid files from being processed or uploaded.
Optimization Tips
1Validate file type immediately before reading file content.
2Stream file data and check size incrementally to avoid high memory use.
3Reject invalid or too large files early to improve server responsiveness.
Performance Quiz - 3 Questions
Test your performance knowledge
Why is reading the entire uploaded file into memory before validation a bad practice?
AIt reduces network transfer time
BIt speeds up validation by having all data at once
CIt increases memory usage and blocks server responsiveness for large files
DIt improves user experience by showing progress
DevTools: Network and Performance panels
How to check: Use Network panel to monitor upload size and time; use Performance panel to check server response time and event loop blocking
What to look for: Look for long blocking times or large memory spikes during file upload and validation phases

Practice

(1/5)
1. What is the main purpose of validating file size and type in a FastAPI upload endpoint?
easy
A. To ensure only allowed file types and sizes are accepted for security and performance
B. To automatically convert files to a specific format
C. To speed up the file upload process by skipping checks
D. To store files directly in the database without validation

Solution

  1. Step 1: Understand file validation purpose

    File validation ensures that only files meeting size and type rules are accepted.
  2. Step 2: Recognize security and performance reasons

    Validating prevents harmful files and avoids server overload from large files.
  3. Final Answer:

    To ensure only allowed file types and sizes are accepted for security and performance -> Option A
  4. Quick Check:

    File validation = security and performance [OK]
Hint: File validation protects server and users from bad files [OK]
Common Mistakes:
  • Thinking validation changes file content
  • Assuming validation speeds upload without checks
  • Ignoring security risks of unvalidated files
2. Which of the following is the correct way to declare a file upload parameter in a FastAPI endpoint to accept files asynchronously?
easy
A. def upload(file: UploadFile = File(...)):
B. def upload(file: str):
C. def upload(file: bytes):
D. def upload(file: int):

Solution

  1. Step 1: Identify FastAPI file upload type

    FastAPI uses UploadFile with File(...) to handle async file uploads.
  2. Step 2: Check parameter types

    Only UploadFile supports async file handling, bytes or str do not.
  3. Final Answer:

    def upload(file: UploadFile = File(...)): -> Option A
  4. Quick Check:

    UploadFile + File(...) = async file upload [OK]
Hint: Use UploadFile with File(...) for async uploads [OK]
Common Mistakes:
  • Using bytes or str instead of UploadFile
  • Missing File(...) dependency
  • Using int type for file parameter
3. Given this FastAPI code snippet, what will happen if a user uploads a 5MB PNG file?
from fastapi import FastAPI, File, UploadFile, HTTPException

app = FastAPI()

@app.post('/upload')
async def upload(file: UploadFile = File(...)):
    if file.content_type not in ['image/png', 'image/jpeg']:
        raise HTTPException(status_code=400, detail='Invalid file type')
    contents = await file.read()
    if len(contents) > 2_000_000:
        raise HTTPException(status_code=400, detail='File too large')
    return {'filename': file.filename, 'size': len(contents)}
medium
A. Returns filename and size successfully
B. Raises HTTPException with 'File too large'
C. Raises HTTPException with 'Invalid file type'
D. Raises a syntax error

Solution

  1. Step 1: Check file type condition

    The file is PNG, which is allowed, so no error here.
  2. Step 2: Check file size condition

    The file size is 5MB (5,000,000 bytes), exceeding 2,000,000 limit, so it raises 'File too large'.
  3. Final Answer:

    Raises HTTPException with 'File too large' -> Option B
  4. Quick Check:

    File size > 2MB = 'File too large' error [OK]
Hint: Check size limit after reading file contents [OK]
Common Mistakes:
  • Confusing file type error with size error
  • Not reading file contents before size check
  • Assuming no error for large files
4. Identify the error in this FastAPI file validation code:
from fastapi import FastAPI, File, UploadFile, HTTPException

app = FastAPI()

@app.post('/upload')
async def upload(file: UploadFile = File(...)):
    if file.content_type != 'image/png' or file.content_type != 'image/jpeg':
        raise HTTPException(status_code=400, detail='Invalid file type')
    contents = await file.read()
    if len(contents) > 1_000_000:
        raise HTTPException(status_code=400, detail='File too large')
    return {'filename': file.filename}
medium
A. The file size check uses wrong comparison operator
B. UploadFile should not be used with File(...)
C. The file type condition always raises error due to incorrect logic
D. Missing await keyword before file.read()

Solution

  1. Step 1: Analyze file type condition logic

    The condition uses 'or' with != checks, so it is always true (a file can't be both types).
  2. Step 2: Understand consequence of condition

    This causes the error to always raise, rejecting all files incorrectly.
  3. Final Answer:

    The file type condition always raises error due to incorrect logic -> Option C
  4. Quick Check:

    Incorrect 'or' with != always true = logic error [OK]
Hint: Use 'and' when checking multiple 'not equals' conditions [OK]
Common Mistakes:
  • Using 'or' instead of 'and' in file type checks
  • Forgetting to await file.read()
  • Misunderstanding UploadFile usage
5. You want to create a FastAPI endpoint that accepts only PDF files smaller than 3MB. Which code snippet correctly implements this validation?
hard
A. async def upload(file: UploadFile = File(...)): contents = await file.read() if file.content_type == 'application/pdf' or len(contents) < 3_000_000: return {'filename': file.filename} raise HTTPException(400, 'Invalid file')
B. async def upload(file: UploadFile = File(...)): if file.content_type == 'application/pdf' or len(await file.read()) < 3_000_000: return {'filename': file.filename} raise HTTPException(400, 'Invalid file')
C. async def upload(file: UploadFile = File(...)): if file.content_type == 'application/pdf' or len(await file.read()) > 3_000_000: raise HTTPException(400, 'Invalid file') return {'filename': file.filename}
D. async def upload(file: UploadFile = File(...)): if file.content_type != 'application/pdf': raise HTTPException(400, 'Invalid type') contents = await file.read() if len(contents) > 3_000_000: raise HTTPException(400, 'Too large') return {'filename': file.filename}

Solution

  1. Step 1: Check file type validation

    Correct snippet uses != 'application/pdf' to reject invalid types before reading contents. Distractors misuse operators like 'or' instead of 'and' or check type after reading.
  2. Step 2: Check file size validation

    After type approval, read contents once and raise if len > 3_000_000. Combined conditions fail due to incorrect logic.
  3. Final Answer:

    Separate type (!=) and size (> 3MB) checks -> Option D
  4. Quick Check:

    != type reject + read then > size reject [OK]
Hint: Check type and size separately with correct logic [OK]
Common Mistakes:
  • Using 'or' instead of 'and' in conditions
  • Reading file multiple times causing empty content
  • Incorrect comparison operators in conditions