Содержание статьи

Flask предоставляет простые инструменты для приёма, обработки и сохранения файлов на сервере. Основной метод работы с файлами – использование объекта request.files, который позволяет получить загруженный файл из HTML-формы с атрибутом enctype=»multipart/form-data».
Перед сохранением важно определить директорию для хранения файлов и убедиться, что она доступна для записи. Flask не создаёт папки автоматически, поэтому рекомендуется использовать os.makedirs для их создания, если они отсутствуют. Также важно проверять тип файлов с помощью secure_filename из модуля werkzeug.utils, чтобы избежать уязвимостей при работе с именами.
Для защиты приложения стоит ограничивать размер загружаемых файлов через конфигурацию app.config[‘MAX_CONTENT_LENGTH’] и фильтровать допустимые расширения через проверку filename.endswith(). После успешной загрузки файл можно сохранить методом file.save(path) и при необходимости отдать пользователю через send_from_directory или send_file.
Работа с временными файлами позволяет обрабатывать данные без долгосрочного хранения. Использование tempfile помогает создавать временные директории и файлы, которые автоматически удаляются после завершения обработки, снижая нагрузку на сервер и предотвращая накопление ненужных данных.
Настройка проекта Flask для работы с файлами

Для работы с файлами в Flask необходимо сначала создать проект с минимальной структурой: директорию приложения, папку для загрузок и файл app.py. В app.py импортируются Flask, request и os для управления путями.
Задайте путь для хранения загруженных файлов через app.config[‘UPLOAD_FOLDER’]. Например, app.config[‘UPLOAD_FOLDER’] = os.path.join(os.path.dirname(__file__), ‘uploads’). Убедитесь, что папка uploads существует или создайте её с помощью os.makedirs с параметром exist_ok=True, чтобы избежать ошибок при повторном запуске приложения.
Ограничьте размер загружаемых файлов через app.config[‘MAX_CONTENT_LENGTH’], указав допустимый предел в байтах. Например, 16 * 1024 * 1024 для максимального размера 16 МБ. Это предотвращает перегрузку сервера большими файлами.
Для повышения безопасности обработка имён файлов выполняется через werkzeug.utils.secure_filename. Этот метод удаляет запрещённые символы и предотвращает возможность записи файлов вне заданной директории.
Приём файлов через HTML-форму
Для загрузки файлов необходимо создать HTML-форму с атрибутом enctype=»multipart/form-data» и методом POST. Это позволяет браузеру корректно передавать данные файла на сервер.
Пример минимальной формы:
- <form method=»POST» action=»/upload» enctype=»multipart/form-data»>
- <input type=»file» name=»file»>
- <button type=»submit»>Загрузить</button>
- </form>
На стороне Flask для получения файла используется request.files. Например, file = request.files[‘file’]. Проверка наличия файла обязательна, чтобы избежать ошибок при отправке пустой формы:
- Проверка ключа в request.files: if ‘file’ not in request.files
- Проверка имени файла: if file.filename == »
- Использование secure_filename(file.filename) для безопасного имени
Рекомендуется ограничивать допустимые расширения файлов с помощью проверки filename.endswith() или набора разрешённых форматов, чтобы защитить сервер от нежелательных данных.
Обработка загруженных файлов в Flask
После получения файла через request.files необходимо выполнить проверку типа и имени для безопасной обработки. Используйте secure_filename из werkzeug.utils, чтобы удалить запрещённые символы и предотвратить запись вне целевой папки.
Для проверки допустимых форматов можно создать таблицу с разрешёнными расширениями:
| Тип файла | Разрешённые расширения |
|---|---|
| Изображения | .jpg, .jpeg, .png, .gif |
| Документы | .pdf, .docx, .txt |
| Архивы | .zip, .tar, .gz |
После проверки расширения файл можно обработать перед сохранением. Например, изображения можно уменьшить с помощью библиотеки Pillow, а текстовые файлы проверить на кодировку UTF-8. Если файл не соответствует допустимым критериям, рекомендуется возвращать пользователю сообщение об ошибке.
Обработка больших файлов выполняется через потоковую запись, чтобы избежать переполнения памяти: file.save(os.path.join(app.config[‘UPLOAD_FOLDER’], filename)) после всех проверок.
Сохранение файлов на сервере
После проверки имени и типа файла его сохраняют в заранее определённую директорию. Используйте os.path.join для формирования корректного пути: file_path = os.path.join(app.config[‘UPLOAD_FOLDER’], secure_filename(file.filename)).
Метод file.save(file_path) выполняет запись на диск. Если директория не существует, её следует создать с помощью os.makedirs(app.config[‘UPLOAD_FOLDER’], exist_ok=True), чтобы избежать ошибок.
Для систем с многопоточными запросами рекомендуется использовать уникальные имена файлов. Можно добавлять временную метку или UUID: filename = f»{uuid.uuid4()}_{secure_filename(file.filename)}». Это предотвращает перезапись существующих файлов.
При сохранении больших файлов целесообразно проверять свободное место на диске и использовать потоковую запись, чтобы снизить нагрузку на память. Также важно устанавливать права доступа к директории, ограничивая запись только для приложения Flask.
Ограничение размера и типа загружаемых файлов

Для защиты сервера от больших файлов и неподходящих форматов в Flask используют конфигурацию и проверку на уровне приложения.
Ограничение размера задаётся через app.config[‘MAX_CONTENT_LENGTH’]. Пример: app.config[‘MAX_CONTENT_LENGTH’] = 16 * 1024 * 1024 – максимальный размер 16 МБ. Если пользователь загружает файл больше лимита, Flask возвращает ошибку 413.
Разрешённые типы файлов проверяют на основе расширения или MIME-типа. Пример проверки расширений:
- Создать множество допустимых расширений: ALLOWED_EXTENSIONS = {‘png’, ‘jpg’, ‘jpeg’, ‘gif’, ‘pdf’, ‘txt’}
- Проверять файл перед сохранением: filename.rsplit(‘.’, 1)[1].lower() in ALLOWED_EXTENSIONS
Для проверки MIME-типа используют file.content_type. Это предотвращает загрузку файлов с изменённым расширением, которые могут быть вредоносными.
- Проверить наличие файла в request.files.
- Проверить имя файла через secure_filename.
- Сравнить расширение с допустимыми значениями.
- При необходимости проверить MIME-тип.
Эти шаги обеспечивают контроль загружаемых данных и предотвращают ошибки и угрозы безопасности.
Работа с временными файлами и безопасными именами

Для временной обработки файлов используют модуль tempfile. Функции NamedTemporaryFile и TemporaryDirectory создают файлы и папки, которые автоматически удаляются после закрытия, что предотвращает накопление ненужных данных на сервере.
Пример создания временного файла для обработки изображения:
with tempfile.NamedTemporaryFile(delete=True) as tmp_file:
file.save(tmp_file.name)
Для безопасного хранения постоянных файлов обязательно применяют secure_filename из werkzeug.utils. Метод удаляет специальные символы, пробелы и потенциально опасные конструкции, предотвращая запись вне целевой директории.
Для уникальности имён можно добавлять временную метку или UUID:
filename = f»{uuid.uuid4()}_{secure_filename(file.filename)}»
Комбинация временных файлов и безопасных имён позволяет обрабатывать данные без риска перезаписи существующих файлов и минимизирует угрозы безопасности при работе с пользовательскими загрузками.
Отправка файлов пользователю для скачивания
Для предоставления пользователю файла используют функции send_from_directory и send_file из Flask. Они позволяют безопасно отдавать файлы из заданной директории или по прямому пути.
Пример с send_from_directory:
return send_from_directory(app.config[‘UPLOAD_FOLDER’], filename, as_attachment=True)
Параметр as_attachment=True заставляет браузер предложить сохранить файл, а не отображать его в окне. Это важно для документов, изображений и архивов.
При использовании send_file можно напрямую указать путь к файлу и MIME-тип:
return send_file(file_path, mimetype=’application/pdf’, as_attachment=True)
Рекомендуется проверять существование файла перед отправкой и использовать secure_filename для имени, чтобы исключить доступ к файлам вне разрешённой директории.
Вопрос-ответ:
Как правильно настроить папку для загрузки файлов в Flask?
В Flask путь для хранения загруженных файлов задаётся через app.config[‘UPLOAD_FOLDER’]. Для корректной работы стоит использовать os.path.join, чтобы формировать абсолютный путь относительно корня проекта. Если папка не существует, её создают через os.makedirs(app.config[‘UPLOAD_FOLDER’], exist_ok=True), чтобы избежать ошибок при сохранении файлов.
Какие меры безопасности применяются при сохранении файлов?
Имя файла следует обрабатывать через secure_filename из werkzeug.utils, чтобы удалить запрещённые символы и предотвратить запись вне целевой папки. Для уникальности имён можно добавлять временную метку или UUID. Также рекомендуется ограничивать типы файлов и проверять MIME-типы, чтобы предотвратить загрузку вредоносных данных.
Как ограничить размер загружаемых файлов в Flask?
Для ограничения размера файлов используется настройка app.config[‘MAX_CONTENT_LENGTH’], которая указывает максимальный размер в байтах. Например, 16 * 1024 * 1024 ограничивает загрузку до 16 МБ. При превышении лимита Flask возвращает ошибку 413, что позволяет предотвратить перегрузку сервера.
Какие способы есть для отправки файлов пользователю на скачивание?
В Flask используют функции send_from_directory и send_file. send_from_directory позволяет отдавать файлы из заданной папки, указывая имя файла и параметр as_attachment=True, чтобы браузер предложил сохранить файл. send_file работает с прямым путём к файлу и позволяет указать MIME-тип. Перед отправкой рекомендуется проверять существование файла и обрабатывать имя через secure_filename.
