DjangoUeditor 是一個相當贊的django 富文本編輯器,你可以在
https://github.com/zhangfisher/DjangoUeditor
查看相關信息。
我一直想着把DjangoUeditor 的圖片和文件存儲修改為七牛雲存儲,但又覺得自己js水平太菜,所以就一直拖延到現在,
其實我根本沒改js。
好了,下面不廢話,開始。
一、文件上傳到七牛
在修改 DjangoUeditor 存儲到七牛之前,我第一步要嘗試的,就是本地文件上傳到七牛。
這一步需要七牛的sdk
https://github.com/qiniu/python-sdk/releases
你可以用
pip install qiniu
安裝。
1 >>> access_key = 'your ak ' 2 >>> secret_key = 'your sk' 3 >>> bucket_name = 'your bucket name' 4 5 >>> from qiniu import Auth,put_file 6 >>> q = Auth(access_key, secret_key) 7 >>> PostFile = 'images/Koala_20141220231309_308.jpg' 8 9 #PostFile 為上傳后所代表的文件及路徑 10 11 >>> token = q.upload_token(bucket_name, PostFile) 12 >>> FilePath = 'C:\\Users\\r3call\\Pictures\\Zhuoku001.jpg' 13 14 # FilePath 為本地文件路徑 15 >>> ret, info = put_file(token, PostFile, FilePath) 16 >>> ret 17 {u'hash': u'Fnpm2Sxt4_oiXtVdG8bONBsnIUAD', u'key': u'images/Koala_20141220231309_308.jpg'}
一旦上傳成功, ret這個字典就會存在名為key的key,我們檢測這個key就可以判斷是否上傳成功。
二、DjangoUeditor 上傳文件到七牛
既然第一步已經成功了,我們就有希望上傳文件到七牛,我首先找到了DjangoUeditor 的處理文件上傳的函數。
這里說說我查找的步驟:
1.找到urls.py
url(r'^controller/$',get_ueditor_controller)
2、這樣我知道函數叫做get_ueditor_controller,那么我到views.py中查找
然后我找到了一個函數叫做 UploadFile ,這個函數對文件上傳進行了 檢測和存儲
其中
state=save_upload_file(file,os.path.join(OutputPath,OutputFile))
是真正處理文件存儲的函數,我們來看看代碼
1 #保存上傳的文件 2 def save_upload_file(PostFile,FilePath): 3 try: 4 f = open(FilePath, 'wb') 5 for chunk in PostFile.chunks(): 6 f.write(chunk) 7 except Exception,E: 8 f.close() 9 return u"寫入文件錯誤:"+ E.message 10 f.close() 11 return u"SUCCESS"
我要把文件上傳到七牛,就需要仿照這個函數對文件進行處理。
於是我編寫了一個函數如下:
1 #保存上傳文件到七牛 2 def save_upload_file_to_qiniu(upload_file,key): 3 access_key = 'your ak' 4 secret_key = 'your sk' 5 bucket_name = 'your bucket name' 6 try: 7 from qiniu import Auth,put_file,put_data 8 q = Auth(access_key, secret_key) 9 token = q.upload_token(bucket_name, key) 10 # ret, info = put_file(token, key, upload_file) 11 ret, info = put_data(token, key, upload_file) 12 if ret.get('key',None) == None: 13 raise Exception('upload error') 14 else: 15 return u"SUCCESS" 16 except Exception, e: 17 print(str(e)) 18 return str(e)
這個函數寫好之后,我要在哪里調用呢?
state=save_upload_file(file,os.path.join(OutputPath,OutputFile))
我把這里修改為
state= save_upload_file_to_qiniu(file,OutputPathFormat)
其中file是上傳過來的圖片,
OutputPathFormat 是生成圖片的文件路徑,類似於 images/Penguins_20141221001519_634.jpg
文件上傳之后,調用save_upload_file_to_qiniu 對文件進行存儲,如果成功,就會返回 SUCCESS,我們把結果返回。
原始返回信息如下
1 return_info = { 2 'url': urllib.basejoin(USettings.gSettings.MEDIA_URL , OutputPathFormat) , # 保存后的文件名稱 3 'original': upload_file_name, #原始文件名 4 'type': upload_original_ext, 5 'state': state, #上傳狀態,成功時返回SUCCESS,其他任何值將原樣返回至圖片上傳框中 6 'size': upload_file_size 7 }
在返回之前,我們還需要定義一個變量
QINIU_BUCKET_DOMAIN = 'http://hello.qiniudn.com/'
這樣,QINIU_BUCKET_DOMAIN 和 OutputPathFormat 連接起來,就是一個完整的文件 URL 地址,類似於
http://hello.qiniudn.com/images/Penguins_20141221001519_634.jpg
我們只需要返回這個URL 給前端即可
1 #返回數據 2 QINIU_BUCKET_DOMAIN = 'http://hello.qiniudn.com/' 3 return_info = { 4 # 'url': urllib.basejoin(USettings.gSettings.MEDIA_URL , OutputPathFormat) , # 保存后的文件名稱 5 'url': urllib.basejoin(QINIU_BUCKET_DOMAIN , OutputPathFormat) , # 保存后的文件名稱 6 'original': upload_file_name, #原始文件名 7 'type': upload_original_ext, 8 'state': state, #上傳狀態,成功時返回SUCCESS,其他任何值將原樣返回至圖片上傳框中 9 'size': upload_file_size 10 }
到此,我們把 DjangoUeditor 的存儲改為七牛基本就結束了,如果需要管理文件,或者將AK 和SK設置到配置文件中,你可能還有些活要做。
注:塗鴉功能並沒有使用同樣的文件存儲函數,如果需要,請單獨處理。
附:修改后的views.py 替換 DjangoUeditor 下的views.py 即可,需要自己填寫ak,sk,QINIU_BUCKET_DOMAIN
使用前需安裝 qiniu sdk