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)
どんな助けでも大歓迎です!