Ho un modello con un FileField
, che contiene i file caricati dall'utente. Dal momento che voglio risparmiare spazio, vorrei evitare i duplicati.Caricamenti Django: Elimina i duplicati caricati, utilizza il file esistente (controllo basato su MD5)
Quello che mi piacerebbe raggiungere:
- Calcolare i file caricati checksum MD5
- Conservare il file con il nome file basandosi sul suo md5sum
- Se un file con questo nome è già presente (il nuovo file è un duplicato), eliminare il file caricato e utilizzare il file esistente invece
e sta già lavorando, ma come potrei dimenticare un duplicato caricato e utilizzare il file esistente, invece?
noti che mi piacerebbe mantenere il file esistente e non sovrascrivere (soprattutto per mantenere l'ora di modifica lo stesso - meglio per il backup).
Note:
- sto usando Django 1.5
- Il gestore di upload è
django.core.files.uploadhandler.TemporaryFileUploadHandler
Codice:
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)
Qualsiasi hel p è apprezzato!
Quanto traffico pensi di ottenere? Se si tratta di un piccolo progetto o di un progetto privato, è possibile sborsare $ 0,50/mese per Amazon S3, o Rackspace Cloudfiles, o qualsiasi altro archivio a basso costo là fuori. –