我有一个带有 的模型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)
任何帮助表示赞赏!