Django uploads: Wirf hochgeladen von Duplikaten verwenden vorhandene Datei (md5-basierte check)

Habe ich ein Modell mit einer FileField ist, die hält Benutzer hochgeladenen Dateien. Da ich Platz sparen wollen, würde ich mag, um Duplikate zu vermeiden.

, Was möchte ich erreichen:

  1. Berechnen die hochgeladenen Dateien md5-Prüfsumme
  2. Speichern Sie die Datei mit der file name basiert auf seiner md5sum
  3. Wenn eine Datei mit diesem Namen ist bereits vorhanden (die neue Datei ist ein doppelte), verwerfen die hochgeladene Datei und die vorhandene Datei verwenden, anstatt

1 und 2 ist bereits in Arbeit, aber wie würde ich vergessen das hochgeladen zu duplizieren und nutzen Sie die vorhandene Datei ersetzen?

Hinweis, dass ich gern die vorhandene Datei und nicht überschrieben (hauptsächlich, um die geänderte Zeit das gleiche - besser für die Datensicherung).

Hinweise:

  • Ich bin mit Django 1.5
  • Der upload-handler ist django.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 ist willkommen!

  • Wie viel Verkehr wollen Sie die bekommen? Wenn es ein kleines Projekt oder ein eigenes Projekt haben, können Sie berappen die $0,50/Monat bei Amazon S3 oder Rackspace Cloudfiles, oder jede andere Billig filestore gibt.
InformationsquelleAutor phoibos | 2013-04-08
Schreibe einen Kommentar