Uploads do Django: Descartar duplicados enviados, usar arquivo existente (cheque baseado em md5)
Eu tenho um modelo com umFileField
, que contém arquivos enviados pelo usuário. Desde que eu quero economizar espaço, gostaria de evitar duplicatas.
O que eu gostaria de alcançar:
Calcular os arquivos enviadoschecksum md5Armazene o arquivo com onome de arquivo baseado em seu md5sumSe um arquivo com esse nome já estiver lá (o novo arquivo é umduplicado)descartar o arquivo carregado e usar o arquivo existente1 e2 já está funcionando, masComo eu poderia esquecer uma duplicata enviada e usar o arquivo existente?
Note que eu gostaria demantenha o arquivo existente enão Sobrescrevê-lo (principalmente para manter o tempo modificado o mesmo - melhor para backup).
Notas:
Estou usando o Django 1.5O manipulador de upload édjango.core.files.uploadhandler.TemporaryFileUploadHandler
Código:
def media_file_name(instance, filename):
h = instance.md5sum
basename, ext = os.path.splitext(filename)
return os.path.join('mediafiles', h[0:1], h[1:2], h + ext.lower())
class Media(models.Model):
orig_file = models.FileField(upload_to=media_file_name)
md5sum = models.CharField(max_length=36)
...
def save(self, *args, **kwargs):
if not self.pk: # file is new
md5 = hashlib.md5()
for chunk in self.orig_file.chunks():
md5.update(chunk)
self.md5sum = md5.hexdigest()
super(Media, self).save(*args, **kwargs)
Qualquer ajuda é apreciada!