Создать и сохранить хэш на основе загруженного файла - PullRequest
0 голосов
/ 17 апреля 2019

В настоящее время я могу загружать файлы в Django Admin, используя FileField.Чего я хочу добиться:

  • Создание хэша на основе загруженного файла и сохранение его в виде поля
  • Определите file_size загруженного файла и сохраните его какполе

My models.py

class File(models.Model):
    file_uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False, db_index=True)
    file_name = models.CharField(max_length=256)
    file_mime = models.CharField(max_length=20)
    file_size = models.PositiveIntegerField(blank=True, null=True, editable=False)
    file_hash = models.CharField(max_length=256, unique=True, blank=True, editable=False)
    data = models.FileField(upload_to=get_dynamic_path)  
    customer_uuid = models.ForeignKey(Customer, on_delete=models.CASCADE)

Я попытался переопределить метод save() следующим образом:

# models.py

def save(self, *args, **kwargs):
    super(File, self).save(*args, **kwargs)
    f = self.data.open('rb')
    h = hashlib.sha1()
    if f.multiple_chunks():
        for chunk in f.chunks():
            h.update(chunk)
    else:
        h.update(f.read())
    f.close()
    self.sha1 = h.hexdigest()
    self.file_size = self.data.size
    super(File, self).save(*args, **kwargs)

Когда я загружаю файл,он загружается просто отлично, но поля file_size и file_hash пусты.

Что мне нужно изменить, чтобы:

  • Успешно сгенерировать хеш на основе загруженного файла и сохранить его в поле file_hash.
  • Определите размер загруженного файла и сохраните его в поле file_size.

EDIT : исправлена ​​ошибка форматирования в StackOverflow, поэтому он напоминал мой фактический код.

Спасибо!

1 Ответ

1 голос
/ 17 апреля 2019

Есть несколько вещей, на которые стоит обратить внимание: 1. Вам не нужно звонить super дважды, как указано mikeyj. 2. Если вы переопределяете сохранение, проверьте, нужно ли вычислять хэш или нет.

# models.py

def save(self, *args, **kwargs):
    if self.file_size is None:
        f = self.data.open('rb')
        h = hashlib.sha1()
        if f.multiple_chunks():
            for chunk in f.chunks():
                h.update(chunk)
        else:  # changed indentation as per my understanding of your code
            h.update(f.read())
        self.sha1 = h.hexdigest()
        self.file_size = self.data.size
        f.close()  # make sure to close the file after operation is done
    super(File, self).save(*args, **kwargs)

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