Функция secure_filename
Функция secure_filename применяется для
преобразования произвольной строки в безопасное
имя файла. Первым параметром передаётся исходное
имя файла. Функция удаляет опасные символы,
отбрасывает пути и возвращает строку, которую
можно безопасно использовать при сохранении
файла на сервере.
Функция полезна при загрузке файлов через формы:
пользователь может передать имя вида
'../../etc/passwd' или имя с пробелами и
спецсимволами, и такое имя нельзя использовать
напрямую.
Синтаксис
from werkzeug.utils import secure_filename
secure_filename(filename)
Функция принимает один обязательный параметр
filename - исходное имя файла в виде строки.
Возвращает очищенное имя файла в виде строки.
Пример
Давайте очистим простое имя файла с пробелами:
from flask import Flask
from werkzeug.utils import secure_filename
app = Flask(__name__)
@app.route('/')
def index():
res = secure_filename('my file.txt')
return res
Результат выполнения кода:
"my_file.txt"
Пример
Давайте попробуем передать опасное имя с путём:
from flask import Flask
from werkzeug.utils import secure_filename
app = Flask(__name__)
@app.route('/')
def index():
res = secure_filename('../../etc/passwd')
return res
Результат выполнения кода:
"etc_passwd"
Как видите, все слеши и опасные элементы пути были заменены на подчёркивания, и файл нельзя записать за пределы нужной директории.
Пример
Давайте применим функцию при загрузке файла из формы. Сначала создадим шаблон:
<form method="post" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit">
</form>
Теперь напишем обработчик, который принимает файл и сохраняет его под безопасным именем:
from flask import Flask, render_template, request
from werkzeug.utils import secure_filename
app = Flask(__name__)
@app.route('/', methods=['GET', 'POST'])
def index():
if request.method == 'POST':
file = request.files['file']
filename = secure_filename(file.filename)
file.save('uploads/' + filename)
return filename
return render_template('index.html')
Если пользователь выберет файл с именем
'my report.pdf', то в ответе вернётся:
"my_report.pdf"
Смотрите также
-
функцию
send_file,
которая отправляет файл клиенту -
функцию
send_from_directory,
которая безопасно отдаёт файл из директории