文件儲存API:https://yiyibooks.cn/xx/django_182/ref/files/storage.html
編寫自定義存儲系統:https://yiyibooks.cn/xx/django_182/howto/custom-file-storage.html
定義一個自定義的儲存類步驟
1.你的自定義儲存類必須是django.core.files.storage.Storage的子類
2.Django必須能夠不帶任何參數來實例化你的儲存類。這意味着任何設置都應該從django.conf.settings中獲取。
3.你的儲存類必須實現 _open() 和 _save()方法,以及任何適合於你的儲存類的其它方法。
4.你的儲存類必須是 可以析構的,所以它在遷移中的一個字段上使用的時候可以被序列化。只要你的字段擁有自己可以序列化的參數,你就可以為它使用django.utils.deconstruct.deconstructible類裝飾器(這也是Django用在FileSystemStorage上的東西)。
自定義儲存類
創建工具包utils/fdfs包
復制客戶端的配置文件client.conf到fdfs的包里
修改client.conf配置文件
# the base path to store log files 記錄日志文件 必須要有這個目錄 base_path=/home/python/bj18/ttsx/dailyfresh/log # tracker_server can ocur more than once, and tracker_server format is # "host:port", host can be hostname or ip address tracker_server=192.168.137.130:22122
需要創建一個日志文件的目錄/home/python/bj18/ttsx/dailyfresh/log
settings.py中配置文件路徑
# 設置django文件存儲類 DEFAULT_FILE_STORAGE = 'utils.fdfs.storage.FDFSStorage' # 設置fdfs使用的client.conf路徑 FDFS_CLIENT_CONF = './utils/fdfs/client.conf' # 設置fdfs存儲服務器上nginx的IP和端口號 FDFS_URL = 'http://192.168.137.130:8000/'
在fdfs/storage.py中導入settings配置初始化FDFSStorage類
from django.core.files.storage import Storage # 導入storage工具類 from fdfs_client.client import Fdfs_client # 客戶端上傳的類 from django.conf import settings # 導入django配置 class FDFSStorage(Storage): # 創建上傳類繼承Storage類 '''fast dfs文件存儲類''' def __init__(self, client_conf=None, base_url=None): if client_conf is None: self.client_conf = settings.FDFS_CLIENT_CONF if base_url is None: self.base_url = settings.FDFS_URL def _open(self, name, mode='rb'): # 必須要有的方法 '''打開文件時使用''' pass def _save(self, name, content): # 必須要有的方法 '''存儲文件時使用''' # name: 你選擇上傳的文件的名字 # content:參數必須為django.core.files.File或者File子類的實例 即:包含你上傳文件內容的file類的對象 # 創建一個Fdfd_client對象 client = Fdfs_client(self.client_conf) # 上傳文件到fast dfs系統中 # upload_by_buffer() 根據文件內容上傳文件 res = client.upload_by_buffer(content.read()) # 返回的是一個字典格式 # dict # { # 'Group name': group_name, # 'Remote file_id': remote_file_id, # 'Status': 'Upload successed.', # 'Local file name': '', # 'Uploaded size': upload_size, # 'Storage IP': storage_ip # } print(res) if res.get('Status') != 'Upload successed.': # res.get()獲取字典里的內容 # 上傳失敗 拋出異常 raise Exception('上傳文件到fdfs失敗') # 獲取文件id filename = res.get('Remote file_id') # 返回文件id return filename def exists(self, name): # 調用_save()前會先調用exists()方法 '''django判斷文件名是否可用''' return False; # False表示沒有這個文件名 該文件名可用 def url(self, name): # 如果沒有這個 在admin顯示詳情的時候會報url()的錯 '''返回文件url路徑''' return self.base_url+name # 一定要加上路徑 不然會導致src導入圖片的時候沒有路徑不顯示
進入后台192.168.137.130:8000/admin
添加圖片看效果