File Uploads & Static Files in FastAPI
Introduction
In real-world applications, APIs often need to handle:
- Uploading files (images, PDFs, videos)
- Serving static content (images, CSS, JS)
FastAPI makes this easy with built-in support for:
-
File uploads using
UploadFile - Serving static files
File Upload in FastAPI
FastAPI provides two ways to upload files:
-
bytes(simple, small files) -
UploadFile(recommended for large files)
Upload File Using UploadFile
from fastapi import FastAPI, UploadFile, Fileapp = FastAPI()@app.post("/upload/")async def upload_file(file: UploadFile = File(...)):return {"filename": file.filename,"content_type": file.content_type}
Why Use UploadFile?
1.Handles large files efficiently
2.Uses temporary storage
3.Supports async operations
Saving Uploaded File
import shutil@app.post("/upload-file/")async def upload_file(file: UploadFile = File(...)):with open(f"uploads/{file.filename}", "wb") as buffer:shutil.copyfileobj(file.file, buffer)return {"message": "File uploaded successfully"}
Make sure uploads/ folder exists.
Upload Multiple Files
from typing import List@app.post("/upload-multiple/")async def upload_multiple(files: List[UploadFile] = File(...)):return [file.filename for file in files]Serving Static Files
To serve static files like images or CSS:
from fastapi.staticfiles import StaticFilesapp.mount("/static", StaticFiles(directory="static"), name="static")Folder Structure Example
project/├── app/├── static/│ ├── image.png│ ├── style.css├── uploads/Access Static Files
Example:http://127.0.0.1:8000/static/image.png
Folder Structure Example
project/├── app/├── static/│ ├── image.png│ ├── style.css├── uploads/
Access Static Files
Example:http://127.0.0.1:8000/static/image.png
Common Mistakes
1. Not creating upload directory
2. Using
bytes for large files3. Not validating file type
4. Exposing sensitive files
Best Practices
1.Validate file type (image, pdf, etc.)
2.Limit file size
3.Store files securely
4.Use cloud storage (AWS S3, etc.) in production
Basic File Validation Example
@app.post("/upload-image/")async def upload_image(file: UploadFile = File(...)):if not file.content_type.startswith("image/"):return {"error": "Only images allowed"}return {"filename": file.filename}
Key Takeaways
- FastAPI supports efficient file uploads
-
UploadFileis best for large files - Static files can be served easily
- Always validate and secure file uploads
Comments
Post a Comment