мой код также является ссылкой
Вам необходимо создать какой-то уникальный идентификатор для добавления к имени файла перед сохранением файла.
Это может быть сделано с чем-то вроде:
from uuid import uuid4
def make_unique(string):
ident = uuid4().__str__()[:8]
return f"{ident}-{string}"
, который может быть использован для добавления 8 случайных символов в начало строки:
>>> make_unique('something.txt')
'aa659bb8-something.txt'
Чтобы использовать это в коде загрузки, просто перед сохранением запустите имя файла через эту функцию. Обязательно сначала укажите имя файла с помощью функции secure_filename
:
if file and allowed_file(file.filename):
original_filename = secure_filename(file.filename)
unique_filename = make_unique(original_filename)
file.save(os.path.join(app.config['UPLOAD_FOLDER'], unique_filename))
Хотя это работает с целью избежать дублирования, в более крупном приложении вы можете расширить это sh. подход.
Если вы храните значения original_filename
и unique_filename
в базе данных, то это позволяет вам сделать следующее в маршруте загрузки:
from flask import send_file
# ...
f = os.path.join(app.config['UPLOAD_FOLDER'], unique_filename)
send_file(f, attachment_filename=original_filename)
Это имеет Преимущество заключается в том, что файл хранится на вашем сервере с уникальным идентификатором, но пользователь никогда не узнает об этом, поскольку файл возвращается к ним с первоначально загруженным именем файла.
Фактически вы можете использовать sh для go далее, и просто сохраните файл на вашем конце с полной строкой uuid; вместо использования функции make_unique
, приведенной выше, измените эту третью строку на:
unique_filename = uuid4().__str__()
Это все равно будет обслуживать файл с правильным mimetype, так как send_file
угадывает mimetype на основе предоставленного attachment_filename
.