【发布时间】:2013-03-30 21:28:53
【问题描述】:
我有一个带有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)
感谢任何帮助!
【问题讨论】:
-
您打算获得多少流量?如果是小型项目或私人项目,您可以每月支付 0.50 美元购买 Amazon S3、Rackspace Cloudfiles 或任何其他便宜的文件存储。
标签: python django django-models django-file-upload