Django-Uploads: Verwerfen Sie hochgeladene Duplikate, verwenden Sie vorhandene Dateien (MD5-basierte Prüfung)

Ich habe ein Model mit einemFileField, der vom Benutzer hochgeladene Dateien enthält. Da ich Platz sparen möchte, möchte ich Doppeleinträge vermeiden.

Was ich gerne erreichen würde:

Berechnung die hochgeladenen Dateienmd5 prüfsummeSpeichern Sie die Datei mit demDateiname basiert auf seiner md5sumWenn eine Datei mit diesem Namen bereits vorhanden ist (die neue Datei ist aDuplikat),Verwerfen Sie die hochgeladene Datei und verwenden Sie stattdessen die vorhandene Datei

1 und2 funktioniert schon, aberWie würde ich ein hochgeladenes Duplikat vergessen und stattdessen die vorhandene Datei verwenden?

Beachten Sie, dass ich möchteBehalten Sie die vorhandene Datei bei undnicht Überschreibe es (hauptsächlich, um die geänderte Zeit gleich zu halten - besser für das Backup).

Anmerkungen:

Ich benutze Django 1.5Der Upload-Handler istdjango.core.files.uploadhandler.TemporaryFileUploadHandler

Code:

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)

Jede Hilfe wird geschätzt!

Antworten auf die Frage(4)

Ihre Antwort auf die Frage