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.
File upload forms in 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.
<form method="POST" enctype="multipart/form-data"> <input type="file" name="file"> <button type="submit">Upload</button> </form>
file = request.files.get('file') if file and file.filename != '': file.save(f"uploads/{file.filename}")
secure_filename to avoid unsafe file names.@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'
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.
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)
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.
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
Solution
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".Step 2: Identify the correct form attribute
The form tag must have the attribute enctype="multipart/form-data" to handle file uploads correctly.Final Answer:
enctype="multipart/form-data" -> Option BQuick Check:
Form enctype = multipart/form-data [OK]
- Using method="get" instead of post
- Forgetting enctype attribute
- Setting type="file" on form tag instead of input
- Confusing action URL with encoding
Solution
Step 1: Identify where uploaded files are stored in Flask
Uploaded files are stored in request.files, not in request.form or request.args.Step 2: Access the file by its form field name
Use request.files['photo'] to get the uploaded file object named 'photo'.Final Answer:
file = request.files['photo'] -> Option DQuick Check:
Uploaded files = request.files [OK]
- 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
file = request.files.get('document')
if file and file.filename != '':
print('File received')
else:
print('No file uploaded')Solution
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.Step 2: Evaluate the if condition
Since file is None, the condition 'file and file.filename != ""' is False, so the else block runs.Final Answer:
No file uploaded -> Option CQuick Check:
No file means else prints [OK]
- 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[]
file = request.files['file']
filename = secure_filename(file)
save_path = os.path.join('uploads', filename)
file.save(save_path)Solution
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.Step 2: Confirm correct file saving steps
After getting a safe filename, join path and call file.save(path) correctly.Final Answer:
secure_filename should be called on file.filename, not file -> Option AQuick Check:
Pass filename string to secure_filename [OK]
- Passing file object to secure_filename
- Confusing file.save argument type
- Misusing os.path.join with non-string
- Assuming request.files returns string
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))Solution
Step 1: Understand getlist() usage
request.files.getlist('images') correctly returns a list of uploaded files for the field 'images'.Step 2: Check file extension filtering
Using file.filename.endswith('.png') is case-sensitive and will miss files with uppercase extensions like '.PNG'.Step 3: Confirm secure_filename usage
secure_filename is correctly called before saving the file.Final Answer:
file.filename.endswith('.png') is case-sensitive and may miss '.PNG' -> Option AQuick Check:
Check file extension case-insensitively [OK]
- Assuming getlist returns one file
- Calling secure_filename after saving
- Ignoring uppercase file extensions
- Not checking if file is None before saving
Ready to prove it?
Pass the test and this pattern moves unknown
