2017-07-06 5 views
3

django-ckeditor/uploaderでアップロードした画像にランダムなuidファイル名を作成したい。Django-CKEeditorでアップロードした画像のuuid4ファイル名を作成する方法は?

私はsettings.pyと同じフォルダにutils.pyを作成しました:

import uuid 

def get_name_uid(): 
    ext = filename.split('.')[-1] 
    filename = "%s.%s" % (uuid.uuid4(), ext) 
    return filename 

私はsettings.pyに、この "ランダム" のファイル名を追加したいと思います:

CKEDITOR_FILENAME_GENERATOR = get_name_uid() 

私はこれをどのように行うことができますか?エディタにアップロードされたファイル名を取得する方法がわかりません。私はsettings.pyからutils.pyにファイル名を渡すべきですか?あるいはこれを行うための別の方法がありますか?

彼らのドキュメントは言うfollowing

それは基本的にすべてのドキュメントであなたのために綴らだ
``CKEDITOR_UPLOAD_PATH = "uploads/"`` 

When using default file system storage, images will be uploaded to "uploads" folder in your MEDIA_ROOT and urls will be created against MEDIA_URL (/media/uploads/image.jpg). 

If you want be able for have control for filename generation, you have to add into settings yours custom filename generator. 

``` 
# utils.py 

def get_filename(filename): 
    return filename.upper() 
``` 

``` 
# settings.py 

CKEDITOR_FILENAME_GENERATOR = 'utils.get_filename' 
``` 

CKEditor has been tested with django FileSystemStorage and S3BotoStorage. 
There are issues using S3Storage from django-storages. 

答えて

5

def get_filename(filename): 
    return filename.upper() # returns the uppercase version of filename 

は、ですから、例えば機能get_filenameが渡されたアップロードファイル名を取得し、あなたがしていますあなたが望むファイル名を返すはずです。これをcallbackと呼びます。

コールバックが引数として渡されるのは、「コールバック署名」と呼ばれ、ドキュメントではそれがきちんと指定されます。

だから、それはmakes senseの場所に関数を置く。チュートリアルで説明した構造の「startprojectを作成しましょう:」の下にmysite/mysite/utils.pyを選択します。したがって、settings.pyと同じディレクトリにあります。

import uuid 
import os.path 

def generate_uuid4_filename(filename): 
    """ 
    Generates a uuid4 (random) filename, keeping file extension 

    :param filename: Filename passed in. In the general case, this will 
        be provided by django-ckeditor's uploader. 
    :return: Randomized filename in urn format. 
    :rtype: str 
    """ 
    discard, ext = os.path.splitext(filename) 
    basename = uuid.uuid4().urn 
    return ''.join(basename, ext) 

は、今すぐあなたのsettings.pyを更新:

# Near the rest of the CKEditor variables 
CKEDITOR_FILENAME_GENERATOR = '<app_label>.utils.generate_uuid4_filename' 

そして、あなたが完了している私はgenerate_uuid4_filenamemysite/mysite/utils.pyは次のようになり、それを名前を付けます。がんばろう!

+0

内部サーバーエラー:/ CKEditorバージョン/アップロード/ module_path、CLASS_NAME = dotted_pa​​th.rsplitは( ''、1) はAttributeError: '関数' オブジェクトが何の属性 'rsplit' を持っていない[06/7月/ 2017年午前14時48 :20] "POST/ckeditor/upload /?CKEditor = id_description&CKEditorFuncNum = 1&langCode = ja HTTP/1.1" 500 97818 – Engo

+0

これはどうして起こるのでしょうか? – Engo

+0

Melvynいいえ? – Engo

関連する問題