Ich habe ein Modell mit einem FileField
, die Benutzer hochgeladenen Dateien enthält. Da ich Platz sparen möchte, möchte ich Duplikate vermeiden.Django Uploads: Verwerfen hochgeladene Duplikate, verwenden Sie vorhandene Datei (MD5 basierte Überprüfung)
Was würde Ich mag erreichen: Prüfsumme
- berechnen die hochgeladenen Dateien md5 mit dem Dateinamen
- speichern Sie die Datei auf der Grundlage seiner md5sum
- Wenn Eine Datei mit diesem Namen ist bereits vorhanden (die neue Datei ist Duplikat), verwerfen die hochgeladene Datei und die vorhandene Datei anstelle
und arbeitet bereits, aber , wie würde ich mich über ein hochgeladenes Duplikat vergessen und nutzen die vorhandene Datei stattdessen?
Beachten Sie, dass Ich mag würde die vorhandene Datei und -halten es nicht überschrieben werden (vor allem die geänderte Zeit zu halten, das gleiche - besser für die Sicherung).
Hinweise:
- Ich verwende 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)
Alle hel p wird geschätzt!
Wie viel Verkehr möchten Sie erhalten? Wenn es sich um ein kleines Projekt oder ein privates Projekt handelt, können Sie die $ 0,50/Monat für Amazon S3 oder Rackspace Cloudfiles oder einen anderen günstigen Filestore ausdiskutieren. –