根据上传的文件生成并保存哈希

时间:2019-04-17 14:14:22

标签: python django

目前,我可以使用FileField在Django Admin中上传文件。我想要实现的是:

  • 根据上传的文件创建哈希并将其保存为字段
  • 确定上传文件的file_size并将其保存为字段

我的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_sizefile_hash字段为空。

我需要更改以下内容:

  • 根据上传的文件成功生成哈希并将其保存在file_hash字段中。
  • 确定上传文件的文件大小,并将其保存在file_size字段中。

编辑: 修复了StackOverflow上的格式错误,使其类似于我的实际代码。

谢谢!

1 个答案:

答案 0 :(得分:1)

有几件事要注意: 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)