Django: Как создать каталог файлов, загрузить файл в этот каталог, получить доступ к этому файлу для расчета и сохранить его для загрузки? - PullRequest
0 голосов
/ 23 октября 2019

Я делаю проект django, который позволяет определенным пользователям:

* first, upload a file with specified file-type;
* second, use that file to perform some calculations; and
* third, provide a derivative file for download.

Затем пользователь может просмотреть список всех загруженных файлов, включая файлы, загруженные другими пользователями, и выбрать, какие файлыдля загрузки или удаления.

Я создал приложение для управления учетными записями пользователей и другое приложение (ядро) для загрузки файлов и расчетов. Теперь я хочу сохранить загруженный файл в определенном каталоге, чтобы я мог легко получить доступ к файлу для извлечения данных.

Я попытался сделать это:

core_app / models.py

def file_path_dir(instance, filename):
    return 'files/{0}/{1}'.format(instance.id, filename)

class Core(models.Model):

    id = models.AutoField(primary_key=True, editable=False)
    date_created = models.DateField(auto_now_add=True)
    user = models.ForeignKey(get_user_model(), on_delete=models.CASCADE)
    csv = models.FileField(upload_to=file_path_dir,
                validators=[FileExtensionValidator(allowed_extensions=['csv'])])  # NOT SAFE 

Здесь я хочу, чтобы файл был загружен в каталог с использованием идентификатора, который будет сохранен в базе данных. Однако вместо этого файл хранился в этом каталоге - files / None / filename.

Я не знаю, почему он говорит «None», когда я успешно сохранил файл в базе данных (используя postgresql). Мне нужна помощь, как решить это или как правильно сделать это, чтобы это работало.

Кроме того, я хотел бы знать самый безопасный / более безопасный способ проверки расширений файлов.

1 Ответ

1 голос
/ 23 октября 2019

file_path_dir вызывается до фактического сохранения на стороне базы данных. И id, который вы используете, еще не создан, потому что функция сохранения еще не вызвана.

Чтобы получить id, вам нужно сохранить экземпляр и файл ввременную папку и затем переместите ее после того, как вы получили id из базы данных.

Но лучший способ сделать это - использовать что-то другое вместо id. Вместо этого вы можете использовать месяц, день или даже год, и если вам действительно нужно что-то уникальное для каждого каталога файлов, вы можете добавить уникальное поле, например дополнительный id или slug, сгенерировать его самостоятельно и использовать это.

И второй вопрос о проверке расширений файлов:

Первый шаг - проверить формат, который вы уже делаете, и обычно он достаточно безопасен в зависимости от платформы. Но если вам нужна дополнительная безопасность, вы можете прочитать файл в безопасной среде и посмотреть, соответствует ли он правилам для этого типа расширения. Или вы можете использовать другие приложения, которые делают это для вас, и использовать их в фоновом режиме.

...