Tôi có một mô hình với FileField
, chứa các tệp do người dùng tải lên. Vì tôi muốn tiết kiệm không gian, tôi muốn tránh trùng lặp.Tải lên Django: Hủy các bản sao được tải lên, sử dụng tệp hiện có (kiểm tra dựa trên md5)
Những gì tôi muốn đạt được:
- Tính các tập tin được tải lên md5 checksum
- Store tập tin với tên tập tin dựa trên md5sum của nó
- Nếu một tệp có tên đó đã có (tệp mới là trùng lặp), loại bỏ các tập tin được tải lên và sử dụng các tập tin hiện tại thay vì
và đã được làm việc, nhưng thế nào tôi sẽ quên đi một trùng lặp được tải lên và sử dụng các tập tin hiện có để thay thế?
Lưu ý rằng tôi muốn giữ các tập tin hiện có và không ghi đè lên nó (chủ yếu là để giữ cho thời gian sửa đổi giống nhau - tốt hơn để sao lưu).
Ghi chú:
- Tôi đang sử dụng Django 1,5
- Việc xử lý tải lên là
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)
Bất kỳ hel p được đánh giá cao!
Bạn dự định nhận bao nhiêu lưu lượng truy cập? Nếu đó là một dự án nhỏ hoặc một dự án riêng tư, bạn có thể chia rẽ trên $ 0,50/tháng cho Amazon S3 hoặc Cloudspace của Rackspace hoặc bất kỳ bộ phim rẻ tiền nào khác ngoài kia. –