Skip to content

File Uploading

File upload forms require a different encoding.

HTML form

<form method="post" enctype="multipart/form-data">
  <input type="file" name="photo" />
  <button type="submit">Upload</button>
</form>
<form method="post" enctype="multipart/form-data">
  <input type="file" name="photo" />
  <button type="submit">Upload</button>
</form>

Flask route

from flask import Flask, request
 
app = Flask(__name__)
 
 
@app.route("/upload", methods=["GET", "POST"])
def upload():
    if request.method == "POST":
        file = request.files.get("photo")
        if not file:
            return "No file uploaded", 400
 
        # saving comes next (see secure filenames)
        return "File received", 200
 
    return "Upload form"
from flask import Flask, request
 
app = Flask(__name__)
 
 
@app.route("/upload", methods=["GET", "POST"])
def upload():
    if request.method == "POST":
        file = request.files.get("photo")
        if not file:
            return "No file uploaded", 400
 
        # saving comes next (see secure filenames)
        return "File received", 200
 
    return "Upload form"

Why request.form doesn’t contain files

Files are streamed separately and exposed via:

  • request.filesrequest.files

Common pitfalls

  • Forgetting enctype="multipart/form-data"enctype="multipart/form-data" → files missing
  • Not setting size limits
  • Accepting any file type blindly

In a real app, validate:

  • allowed file extensions
  • MIME type
  • file size

If this helped you, consider buying me a coffee ☕

Buy me a coffee

Was this page helpful?

Let us know how we did