File uploads let users send files to your web app. Handling them correctly helps you save and use these files safely.
File uploads handling in Flask
from flask import Flask, request app = Flask(__name__) @app.route('/upload', methods=['POST']) def upload_file(): if 'file' not in request.files: return 'No file part' file = request.files['file'] if file.filename == '': return 'No selected file' if file: file.save('/path/to/save/' + file.filename) return 'File uploaded successfully'
Use request.files to get uploaded files.
Always check if the file exists and has a filename before saving.
file = request.files['file'] file.save('/uploads/' + file.filename)
if 'file' not in request.files: return 'No file part'
if file.filename == '': return 'No selected file'
This Flask app shows a simple page with a file upload form. When a user picks a file and submits, the file is saved to the 'uploads' folder on the server. It checks if a file was sent and if it has a name before saving.
from flask import Flask, request, render_template_string import os app = Flask(__name__) UPLOAD_FOLDER = 'uploads' os.makedirs(UPLOAD_FOLDER, exist_ok=True) @app.route('/') def index(): return render_template_string(''' <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Upload File</title> </head> <body> <h1>Upload a File</h1> <form method="POST" action="/upload" enctype="multipart/form-data"> <input type="file" name="file" aria-label="Choose file to upload" required> <button type="submit">Upload</button> </form> </body> </html> ''') @app.route('/upload', methods=['POST']) def upload_file(): if 'file' not in request.files: return 'No file part' file = request.files['file'] if file.filename == '': return 'No selected file' filepath = os.path.join(UPLOAD_FOLDER, file.filename) file.save(filepath) return f'File "{file.filename}" uploaded successfully to "{filepath}"' if __name__ == '__main__': app.run(debug=True)
Always use enctype="multipart/form-data" in your HTML form for file uploads.
Check file extensions and size to improve security before saving files.
Create the upload folder beforehand or use os.makedirs with exist_ok=True.
Use request.files to get uploaded files in Flask.
Always check if the file exists and has a filename before saving.
Save files to a safe folder and use proper HTML form encoding.
Practice
Solution
Step 1: Understand Flask request objects
Flask provides different objects to access data sent by the client.request.filesholds uploaded files.Step 2: Identify correct object for file uploads
Files sent via form withenctype='multipart/form-data'are accessed throughrequest.files.Final Answer:
request.files -> Option AQuick Check:
File uploads = request.files [OK]
- Using request.form to get files
- Trying to access files via request.args
- Not using multipart/form-data in form
Solution
Step 1: Check file presence in request.files
Use'file' in request.filesto confirm the file key exists.Step 2: Ensure filename is not empty
Checkrequest.files['file'].filename != ''to confirm a file was selected.Final Answer:
if 'file' in request.files and request.files['file'].filename != '' -> Option DQuick Check:
Check key and filename before saving [OK]
- Checking request.form instead of request.files
- Not verifying filename is not empty
- Using request.args for file data
from flask import Flask, request
app = Flask(__name__)
@app.route('/upload', methods=['POST'])
def upload():
f = request.files['file']
filename = f.filename
return f"Uploaded: {filename}"Solution
Step 1: Access file from request.files
The code gets the file object fromrequest.files['file'], which holds the uploaded file.Step 2: Return the filename string
The filename attribute contains the original file name, here 'photo.png', which is returned in the response.Final Answer:
Uploaded: photo.png -> Option CQuick Check:
Filename returned matches uploaded file [OK]
- Assuming filename is None if file exists
- Not using request.files to get file
- Forgetting to use POST method
@app.route('/upload', methods=['POST'])
def upload():
file = request.files['file']
if file.filename:
file.save('/uploads/' + file.filename)
return 'File saved'Solution
Step 1: Check for 'file' key in request.files
The code accessesrequest.files['file']directly without verifying if the key exists, risking a KeyError.Step 2: Properly check key before accessing
Useif 'file' in request.filesbefore accessing to avoid errors.Final Answer:
Saving file without checking if 'file' key exists in request.files -> Option BQuick Check:
Always check key exists before accessing [OK]
- Directly accessing request.files['file'] without check
- Assuming filename always exists
- Ignoring form enctype for file uploads
Solution
Step 1: Understand filename security risks
Using raw filenames can allow directory traversal or unsafe characters causing security issues.Step 2: Use secure_filename() to sanitize filenames
Thesecure_filename()function cleans the filename to a safe format before saving.Final Answer:
Use secure_filename() from werkzeug.utils before saving the file -> Option AQuick Check:
Sanitize filenames with secure_filename() [OK]
- Saving files with user-provided names directly
- Ignoring filename sanitization
- Using fixed names causing overwrites
Ready to prove it?
Pass the test and this pattern moves unknown
