Как я должен обрабатывать повторяющиеся имена файлов при загрузке файла с Flask - PullRequest
1 голос
/ 01 мая 2020

Я недавно сталкивался с этим вопросом и отвечал { ссылка } относительно Flask загрузки файлов.

Это работало прекрасно, пока я снова не загрузил изображение с тем же именем. Это не изменило изображение или наложило его.

Мой вопрос здесь заключается в том, что если пользователь загружает изображение с тем же именем, есть ли способ показать сообщение об ошибке или, возможно, автоматически изменить имя на другое.

Для автоматов c меняя имя, я исследовал, и это можно сделать через resol_conflict , но я не мог понять, как это реализовать.

1 Ответ

2 голосов
/ 01 мая 2020

мой код также является ссылкой

Вам необходимо создать какой-то уникальный идентификатор для добавления к имени файла перед сохранением файла.

Это может быть сделано с чем-то вроде:

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 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...