Bird
Raised Fist0
Flaskframework~5 mins

File upload forms in Flask

Choose your learning style10 modes available
Introduction

File upload forms let users send files like images or documents to your website. This helps you collect data or let users share content easily.

When users need to upload profile pictures on a social site.
When collecting documents like resumes or reports from users.
When allowing users to share images or videos in a chat app.
When building an admin panel to upload files to the server.
When creating a form to submit attachments with feedback or support requests.
Syntax
Flask
from flask import Flask, request, render_template
from werkzeug.utils import secure_filename

app = Flask(__name__)

@app.route('/upload', methods=['GET', 'POST'])
def upload_file():
    if request.method == 'POST':
        file = request.files.get('file')
        if file and file.filename != '':
            filename = secure_filename(file.filename)
            file.save(f"uploads/{filename}")
            return 'File uploaded successfully'
    return render_template('upload.html')

Use request.files['file'] to get the uploaded file from the form.

The form must have enctype="multipart/form-data" to send files properly.

Examples
Basic HTML form to select and upload a file.
Flask
<form method="POST" enctype="multipart/form-data">
  <input type="file" name="file">
  <button type="submit">Upload</button>
</form>
Check if a file was uploaded and save it to the 'uploads' folder.
Flask
file = request.files.get('file')
if file and file.filename != '':
    file.save(f"uploads/{file.filename}")
Use secure_filename to avoid unsafe file names.
Flask
@app.route('/upload', methods=['POST'])
def upload():
    file = request.files['file']
    if file:
        filename = secure_filename(file.filename)
        file.save(f"uploads/{filename}")
        return 'Upload done!'
    return 'No file selected'
Sample Program

This Flask app shows a simple file upload form. When a user picks a file and submits, the file is saved safely in the 'uploads' folder. It uses secure_filename to keep file names safe and includes accessibility with an aria-label.

Flask
from flask import Flask, request, render_template_string
from werkzeug.utils import secure_filename
import os

app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = 'uploads'

if not os.path.exists(app.config['UPLOAD_FOLDER']):
    os.makedirs(app.config['UPLOAD_FOLDER'])

UPLOAD_FORM = '''
<!doctype html>
<title>Upload File</title>
<h1>Upload a file</h1>
<form method="POST" enctype="multipart/form-data">
  <input type="file" name="file" aria-label="File upload">
  <button type="submit">Upload</button>
</form>
'''

@app.route('/upload', methods=['GET', 'POST'])
def upload():
    if request.method == 'POST':
        file = request.files.get('file')
        if file and file.filename != '':
            filename = secure_filename(file.filename)
            filepath = os.path.join(app.config['UPLOAD_FOLDER'], filename)
            file.save(filepath)
            return f'File "{filename}" uploaded successfully.'
        return 'No file selected.'
    return render_template_string(UPLOAD_FORM)

if __name__ == '__main__':
    app.run(debug=True)
OutputSuccess
Important Notes

Always check if a file was actually selected before saving.

Use secure_filename from werkzeug.utils to avoid security risks with file names.

Make sure the upload folder exists and your app has permission to write there.

Summary

File upload forms let users send files to your Flask app.

Use request.files and set form enctype to multipart/form-data.

Always save files safely using secure_filename and check for empty uploads.

Practice

(1/5)
1. What must you set in the HTML form tag to allow file uploads in a Flask app?
easy
A. method="get"
B. enctype="multipart/form-data"
C. action="upload"
D. type="file"

Solution

  1. Step 1: Understand form encoding for file uploads

    File uploads require the form to send data in a special format that supports files, which is "multipart/form-data".
  2. Step 2: Identify the correct form attribute

    The form tag must have the attribute enctype="multipart/form-data" to handle file uploads correctly.
  3. Final Answer:

    enctype="multipart/form-data" -> Option B
  4. Quick Check:

    Form enctype = multipart/form-data [OK]
Hint: File uploads always need enctype multipart/form-data [OK]
Common Mistakes:
  • Using method="get" instead of post
  • Forgetting enctype attribute
  • Setting type="file" on form tag instead of input
  • Confusing action URL with encoding
2. Which Flask code correctly accesses an uploaded file named 'photo' from a form?
easy
A. file = request.form['photo']
B. file = request.args['photo']
C. file = request.data['photo']
D. file = request.files['photo']

Solution

  1. Step 1: Identify where uploaded files are stored in Flask

    Uploaded files are stored in request.files, not in request.form or request.args.
  2. Step 2: Access the file by its form field name

    Use request.files['photo'] to get the uploaded file object named 'photo'.
  3. Final Answer:

    file = request.files['photo'] -> Option D
  4. Quick Check:

    Uploaded files = request.files [OK]
Hint: Use request.files to get uploaded files, not request.form [OK]
Common Mistakes:
  • Using request.form to get files
  • Using request.args which is for URL params
  • Trying to access request.data as a dict
  • Misspelling 'files' or field name
3. What will the following Flask code print if no file is uploaded?
file = request.files.get('document')
if file and file.filename != '':
    print('File received')
else:
    print('No file uploaded')
medium
A. File received
B. KeyError exception
C. No file uploaded
D. Empty string printed

Solution

  1. Step 1: Understand request.files.get behavior when no file sent

    request.files.get('document') returns None if no file was uploaded with that name.
  2. Step 2: Evaluate the if condition

    Since file is None, the condition 'file and file.filename != ""' is False, so the else block runs.
  3. Final Answer:

    No file uploaded -> Option C
  4. Quick Check:

    No file means else prints [OK]
Hint: Check file is not None and filename not empty to confirm upload [OK]
Common Mistakes:
  • Assuming request.files['document'] raises error if missing
  • Not checking filename for empty string
  • Expecting 'File received' even if no file sent
  • Confusing request.files.get with request.files[]
4. Identify the error in this Flask file upload snippet:
file = request.files['file']
filename = secure_filename(file)
save_path = os.path.join('uploads', filename)
file.save(save_path)
medium
A. secure_filename should be called on file.filename, not file
B. file.save() requires a file object, not a path
C. os.path.join cannot join strings
D. request.files['file'] returns a string, not a file object

Solution

  1. Step 1: Check usage of secure_filename

    secure_filename expects a string filename, but file is a file object, so file.filename should be passed.
  2. Step 2: Confirm correct file saving steps

    After getting a safe filename, join path and call file.save(path) correctly.
  3. Final Answer:

    secure_filename should be called on file.filename, not file -> Option A
  4. Quick Check:

    Pass filename string to secure_filename [OK]
Hint: Use secure_filename(file.filename), not file itself [OK]
Common Mistakes:
  • Passing file object to secure_filename
  • Confusing file.save argument type
  • Misusing os.path.join with non-string
  • Assuming request.files returns string
5. You want to allow users to upload multiple images at once and save only PNG files securely. What issue does this Flask code snippet have?
files = request.files.getlist('images')
for file in files:
    if file and file.filename.endswith('.png'):
        filename = secure_filename(file.filename)
        file.save(os.path.join('uploads', filename))
hard
A. file.filename.endswith('.png') is case-sensitive and may miss '.PNG'
B. getlist() returns a single file, so loop will fail
C. secure_filename should be called after saving the file
D. This code correctly filters PNG files and saves them securely

Solution

  1. Step 1: Understand getlist() usage

    request.files.getlist('images') correctly returns a list of uploaded files for the field 'images'.
  2. Step 2: Check file extension filtering

    Using file.filename.endswith('.png') is case-sensitive and will miss files with uppercase extensions like '.PNG'.
  3. Step 3: Confirm secure_filename usage

    secure_filename is correctly called before saving the file.
  4. Final Answer:

    file.filename.endswith('.png') is case-sensitive and may miss '.PNG' -> Option A
  5. Quick Check:

    Check file extension case-insensitively [OK]
Hint: Check file extensions case-insensitively for uploads [OK]
Common Mistakes:
  • Assuming getlist returns one file
  • Calling secure_filename after saving
  • Ignoring uppercase file extensions
  • Not checking if file is None before saving
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