中文圈關于Django Admin 上傳文件到七牛云的資料和函數庫已經是2年前的了,國外的則都是關于AWS S3、Azure Storage一些國外的服務的。我根據Django的文檔里提到的存儲系統來實現上傳文件到七牛云的簡單功能。
在Django Admin的表單是根據數據模型生成的,其中文件上傳由FileField和繼承FileField的ImageField來決定的,文件上傳到靜態文件目錄,數據庫保存相對路徑。實現上傳文件到七牛云我們是根據FileField的storage參數來實現的。
models.ImageField(storage=MyStorage())
storage參數需要傳入一個實現抽象類Storage的對象。
下面引用文檔的原句
你自定義的存儲系統必須為Django.core.files.storage.Storage
的一個子類:
1
2
3
4
5
6
7
8
|
from django.conf import settings from django.core.files.storage import Storage class MyStorage(Storage): def __init__( self , option = None ): if not option: option = settings.CUSTOM_STORAGE_OPTIONS ... |
然后重寫全部的抽象方法,具體的可以去官網文檔看。我們這里先不繼承Storage。我在Django的核心里找到了已經繼承了的FileSystemStorage,我想只要繼承Django標準的文件管理類
FileSystemStorage,重載_save部分變成上傳到七牛云不就好了。說干就干。
1
2
3
4
5
6
7
8
|
class MyStorage(FileSystemStorage): def _save( self , name, content): # 延續原方法的寫法 filename = name.replace( '\\', ' / ') # 將文件傳入封裝好的對象里 q = Qiniu() q.upload_stream(filename, content. file .getvalue()) return filename |
我簡單寫一下封裝的Qiniu上傳的類
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
class Qiniu(): def __init__( self ): self .access_key = settings.QINIU_ACCESS_KEY self .secret_key = settings.QINIU_SECRET_KEY # 要上傳的空間 self .bucket_name = settings.QINIU_BUCKET_NAME # 構建鑒權對象 self .auth = Auth( self .access_key, self .secret_key) def get_token( self , key): """ :param key: 文件名 :return: 上傳令牌 """ policy = { 'scope' : settings.QINIU_BUCKET_NAME, 'mimeLimit' : 'image/jpeg;image/png' , 'deadline' : 3600 } # 3600為token過期時間,秒為單位。3600等于一小時 token = self .auth.upload_token( self .bucket_name, key, 3600 , policy) return token def upload_stream( self , filename, stream_data): """ :param filename: 文件名 :param stream_data: 二進制數據 :return: 無 """ # 上傳后保存的文件名 key = filename # 生成上傳 Token,可以指定過期時間等 token = self .auth.upload_token( self .bucket_name, key, 3600 ) # 要上傳文件的本地路徑 # localfile = file_path ret, info = put_data(up_token = token, key = key, data = stream_data) assert ret[ 'key' ] = = key # assert ret['hash'] == etag_stream(stream_data) |
參考資料:
https://docs.djangoproject.co ...
總結
到此這篇關于Django Admin 上傳文件到七牛云的文章就介紹到這了,更多相關Django Admin 上傳文件到七牛云內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!
原文鏈接:https://segmentfault.com/a/1190000022978119