Статья Автор: Деникина Н.В., Деникин А.В.

Работа с файлами в Flask. Основные методы request

Когда загружаем файлы через форму в Flask, они попадают в объект request
 

1. Основные методы для загрузки файлов

Получение файла из формы

file = request.files['имя_поля_в_форме']

Пример:

<!-- В форме -->
<input type="file" name="myfile">
# В коде Flask
uploaded_file = request.files['myfile']

Проверка, был ли отправлен файл

if 'myfile' not in request.files:
    return "Файл не был отправлен"

Проверка, что файл не пустой

if file.filename == '':
    return "Не выбран файл для загрузки"

2. Свойства и методы загруженного файла

Имя файла

filename = file.filename  # "example.jpg"

MIME-тип файла

content_type = file.content_type  # "image/jpeg"

Размер файла (в байтах)

file_size = file.content_length

Сохранение файла на сервер

file.save('/путь/куда/сохранить/filename.jpg')

Чтение файла как бинарных данных

file_data = file.read()  # Читает весь файл в память

Чтение файла по частям (для больших файлов)

chunk = file.stream.read(1024)  # Читает по 1 КБ за раз
while chunk:
    # Обработка chunk
    chunk = file.stream.read(1024)

Получение файла как файлового объекта

file_stream = file.stream  # Получаем поток файла

3. Работа с множественными файлами

Если в форме разрешена множественная загрузка:

<input type="file" name="files" multiple>

Обработка в Flask:

files = request.files.getlist('files')  # Получаем список файлов

for file in files:
    if file.filename != '':
        file.save(os.path.join(app.config['UPLOAD_FOLDER'], file.filename))

4. Дополнительные методы для обработки файлов

Проверка расширения файла

def allowed_file(filename):
    ... (самостоятельно напишите, пожалуйста)

Создание безопасного имени файла (исключая странные символы и пр)

from werkzeug.utils import secure_filename

safe_filename = secure_filename(file.filename)  # "My File.jpg" → "My_File.jpg"

Получение информации о загруженном файле

file_info = {
    'name': file.filename,
    'type': file.content_type,
    'size': file.content_length,
    'headers': dict(file.headers)  # Заголовки файла
}

Полный пример обработки файла

from flask import Flask, request, redirect, url_for
from werkzeug.utils import secure_filename
import os

app = Flask(__name__)

# обычно делают так...
app.config['UPLOAD_FOLDER'] = 'uploads'
app.config['ALLOWED_EXTENSIONS'] = {'txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif'}

def allowed_file(filename):
    ... (самостоятельно напишите, пожалуйста)

@app.route('/upload', methods=['POST'])
def upload_file():
    # Проверяем наличие файла в запросе
    if 'file' not in request.files:
        return redirect(request.url)  # 
    
    file = request.files['file']
    
    # Если пользователь не выбрал файл
    if file.filename == '':
        return redirect(request.url)
    
    # Если файл разрешенного типа
    if file and allowed_file(file.filename):
        # Создаем безопасное имя файла
        filename = secure_filename(file.filename)
        
        # Создаем папку для загрузки, если ее нет
        os.makedirs(app.config['UPLOAD_FOLDER'], exist_ok=True)
        
        # Сохраняем файл
        filepath = os.path.join(app.config['UPLOAD_FOLDER'], filename)
        file.save(filepath)
        
        # Можно также прочитать содержимое файла
        file_content = file.read()
        # Не забудь вернуться в начало файла, если нужно читать снова
        file.seek(0)
        
        return f"Файл {filename} успешно загружен! Размер: {len(file_content)} байт"
    
    return "Недопустимый тип файла"

Важно!

  1. Всегда используйте secure_filename() для имен файлов
  2. Проверяйте расширения файлов перед сохранением
  3. Для больших файлов используйте потоковое чтение (file.stream)
  4. Не забывайте закрывать файлы после работы с ними
  5. Для множественных файлов используйте request.files.getlist()


Таблица с основными функциями и свойствами объекта request в Flask, которые часто используются при работе с файлами:

Функция/Свойство Описание Пример использования
request.files Словарь всех загруженных файлов file = request.files['file_field']
request.files.getlist() Получает список файлов (если multiple upload) files = request.files.getlist('files_field')
file.filename Имя загруженного файла filename = file.filename
file.content_type MIME-тип файла (например, "image/jpeg") if file.content_type == 'image/jpeg':
file.content_length Размер файла в байтах size = file.content_length
file.save() Сохраняет файл на сервер file.save('/path/to/save/filename.jpg')
file.read() Читает содержимое файла как бинарные данные data = file.read()
file.stream Поток для чтения файла (полезно для больших файлов) chunk = file.stream.read(1024)
file.headers Заголовки файла content_type = file.headers['Content-Type']
request.method HTTP-метод запроса (GET, POST и т.д.) if request.method == 'POST':
request.form Данные формы (кроме файлов) username = request.form['username']
request.values Комбинированные данные формы и URL-параметров value = request.values.get('param')
request.headers Заголовки HTTP-запроса user_agent = request.headers.get('User-Agent')
request.remote_addr IP-адрес клиента ip = request.remote_addr
request.url Полный URL запроса return redirect(request.url)
request.referrer URL источника запроса return redirect(request.referrer or url_for('index'))
request.is_secure Был ли запрос через HTTPS if request.is_secure:
request.get_json() Получает JSON данные из запроса data = request.get_json()
request.cookies Куки запроса username = request.cookies.get('username')
request.args Параметры URL (GET-параметры) page = request.args.get('page', default=1, type=int)
request.data Необработанные данные запроса (если не form/json) raw_data = request.data
request.blueprint Имя текущего blueprint (если используется) bp_name = request.blueprint
request.endpoint Имя текущего endpoint endpoint = request.endpoint
request.view_args Аргументы текущего роута args = request.view_args
Пропустить Навигационные Ссылки.
Чтобы оставить комментарий нужна авторизация
Печать