Когда загружаем файлы через форму в 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 "Недопустимый тип файла"
Важно!
- Всегда используйте
secure_filename()
для имен файлов
- Проверяйте расширения файлов перед сохранением
- Для больших файлов используйте потоковое чтение (
file.stream
)
- Не забывайте закрывать файлы после работы с ними
- Для множественных файлов используйте
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 |