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みたいな悲しいファイル名にならずに済みます。かんたーん。
