У меня есть модель с FileField
, которая содержит загруженные пользователем файлы. Поскольку я хочу сэкономить место, я бы хотел избежать дубликатов.
Что я хотел бы достичь:
- Вычислить загруженные файлы контрольная сумма md5
- Сохраните файл с именем файла на основе его md5sum
- Если файл с таким именем уже существует (новый файл дубликат), отбросить загруженный файл и вместо него использовать существующий файл
1 и 2 уже работает, но как бы я забыл о загруженном дубликате и вместо этого использовал существующий файл?
Обратите внимание, что я хотел бы сохранить существующий файл и не перезаписывать его (в основном, чтобы сохранить измененное время одинаковым - лучше для резервного копирования).
Примечания:
- Я использую Django 1.5
- Обработчик загрузки
django.core.files.uploadhandler.TemporaryFileUploadHandler
Код:
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)
Любая помощь приветствуется!