Bird
Raised Fist0
Flaskframework~5 mins

File uploads handling in Flask

Choose your learning style10 modes available
Introduction

File uploads let users send files to your web app. Handling them correctly helps you save and use these files safely.

When users need to upload profile pictures.
When allowing users to submit documents or reports.
When building a form that accepts images or PDFs.
When you want to save user files on the server.
When processing files for further actions like analysis or display.
Syntax
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.

Examples
Saves the uploaded file to the '/uploads/' folder with its original name.
Flask
file = request.files['file']
file.save('/uploads/' + file.filename)
Checks if the file was sent in the request.
Flask
if 'file' not in request.files:
    return 'No file part'
Ensures the user selected a file before saving.
Flask
if file.filename == '':
    return 'No selected file'
Sample Program

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.

Flask
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)
OutputSuccess
Important Notes

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.

Summary

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

(1/5)
1. In Flask, which object do you use to access files uploaded by a user in a form?
easy
A. request.files
B. request.form
C. request.args
D. request.data

Solution

  1. Step 1: Understand Flask request objects

    Flask provides different objects to access data sent by the client. request.files holds uploaded files.
  2. Step 2: Identify correct object for file uploads

    Files sent via form with enctype='multipart/form-data' are accessed through request.files.
  3. Final Answer:

    request.files -> Option A
  4. Quick Check:

    File uploads = request.files [OK]
Hint: Uploaded files are in request.files, not request.form [OK]
Common Mistakes:
  • Using request.form to get files
  • Trying to access files via request.args
  • Not using multipart/form-data in form
2. Which of the following is the correct way to check if a file was uploaded before saving it in Flask?
easy
A. if request.args.get('file')
B. if request.files['file'] is None
C. if request.form['file'] != None
D. if 'file' in request.files and request.files['file'].filename != ''

Solution

  1. Step 1: Check file presence in request.files

    Use 'file' in request.files to confirm the file key exists.
  2. Step 2: Ensure filename is not empty

    Check request.files['file'].filename != '' to confirm a file was selected.
  3. Final Answer:

    if 'file' in request.files and request.files['file'].filename != '' -> Option D
  4. Quick Check:

    Check key and filename before saving [OK]
Hint: Check both key and filename before saving file [OK]
Common Mistakes:
  • Checking request.form instead of request.files
  • Not verifying filename is not empty
  • Using request.args for file data
3. What will be the output of this Flask route when a file named 'photo.png' is uploaded?
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}"
medium
A. Uploaded: None
B. KeyError: 'file'
C. Uploaded: photo.png
D. Uploaded: ''

Solution

  1. Step 1: Access file from request.files

    The code gets the file object from request.files['file'], which holds the uploaded file.
  2. Step 2: Return the filename string

    The filename attribute contains the original file name, here 'photo.png', which is returned in the response.
  3. Final Answer:

    Uploaded: photo.png -> Option C
  4. Quick Check:

    Filename returned matches uploaded file [OK]
Hint: Filename attribute holds the uploaded file's name [OK]
Common Mistakes:
  • Assuming filename is None if file exists
  • Not using request.files to get file
  • Forgetting to use POST method
4. Identify the error in this Flask file upload code snippet:
@app.route('/upload', methods=['POST'])
def upload():
    file = request.files['file']
    if file.filename:
        file.save('/uploads/' + file.filename)
    return 'File saved'
medium
A. Using POST method instead of GET
B. Saving file without checking if 'file' key exists in request.files
C. Missing return statement
D. Incorrect filename attribute usage

Solution

  1. Step 1: Check for 'file' key in request.files

    The code accesses request.files['file'] directly without verifying if the key exists, risking a KeyError.
  2. Step 2: Properly check key before accessing

    Use if 'file' in request.files before accessing to avoid errors.
  3. Final Answer:

    Saving file without checking if 'file' key exists in request.files -> Option B
  4. Quick Check:

    Always check key exists before accessing [OK]
Hint: Check 'file' key in request.files before accessing [OK]
Common Mistakes:
  • Directly accessing request.files['file'] without check
  • Assuming filename always exists
  • Ignoring form enctype for file uploads
5. You want to securely save an uploaded file in Flask to a folder named 'uploads'. Which of the following is the best practice to avoid security risks?
hard
A. Use secure_filename() from werkzeug.utils before saving the file
B. Save the file directly with file.filename without changes
C. Rename the file to a fixed name like 'upload.txt' always
D. Save files outside the Flask app folder without any checks

Solution

  1. Step 1: Understand filename security risks

    Using raw filenames can allow directory traversal or unsafe characters causing security issues.
  2. Step 2: Use secure_filename() to sanitize filenames

    The secure_filename() function cleans the filename to a safe format before saving.
  3. Final Answer:

    Use secure_filename() from werkzeug.utils before saving the file -> Option A
  4. Quick Check:

    Sanitize filenames with secure_filename() [OK]
Hint: Always sanitize filenames with secure_filename() before saving [OK]
Common Mistakes:
  • Saving files with user-provided names directly
  • Ignoring filename sanitization
  • Using fixed names causing overwrites
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