UUIDを使ったファイル名で保存する(Django)

2009/04/15 01:08

※ 商品のリンクをクリックして何かを購入すると私に少額の報酬が入ることがあります【広告表示】

昔のDjangoにあった「マルチバイトのファイルをアップするとマルチバイト部分が消えてしまう問題」は回避できるようになっています。

それどころか、バックエンドのストレージも替えられるようになっています。

とりあえず保存できるようにすればいいのであれば、ファイル名をUUIDにしてしまうだけでいいでしょう。

    # encoding: utf-8
    # Copyright (c) 2009 Makoto Tsuyuki All rights reserved
    # New BSD License

    from django.core.files.storage import FileSystemStorage
    from uuid import uuid4 as uuid #require python2.5 or above
    import os

    class UUIDFileSystemStorage(FileSystemStorage):
      def get_valid_name(self, name):
        '''
        return the new filename using uuid(except hyphen) and original extension.
        '''
        fn,ext = os.path.splitext(name)
        return uuid().hex + (ext or '')

本来の用途であるカスタムストレージの仕組みを実装する場合にはもう少しコードを書かなければなりませんが、ファイル名を好きにしたいだけなので、通常のファイルストレージを継承してファイル名の生成部分のみを上書きしています。

これを使うには、models.FileFieldやmodels.ImageFieldのフィールド定義時にstorageとして指定します。

    uuidfs = UUIDFileSystemStorage()

    class TestModel(models.Model):
      title = models.CharField(max_length=10)
      img = models.ImageField(upload_to='path to upload', storage=uuidfs)

これで、_.jpgや__.jpgみたいな悲しいファイル名にならずに済みます。かんたーん。

Prev Entry

Next Entry