自定義django儲存類
阿新 • • 發佈:2018-12-10
自定義檔案儲存系統
from django.core.files.storage import Storage from fdfs_client.client import Fdfs_client from django.conf import settings
class FastDFSStorage(Storage): “”“自定義檔案儲存系統”""
def __init__(self, client_conf=None, base_url=None): self.client_conf = client_conf or settings.FDFS_CLIENT_CONF self.base_url = base_url or settings.FDFS_BASE_URL def _open(self, name, mode='rb'): """開啟檔案時會自動呼叫的方法 因為這個類是實現儲存,不涉及到檔案的開啟,所以這個方法用不到,但是,必須文件告訴我必須實現,所以pass """ pass def _save(self, name, content): """ 檔案要儲存時會自動的呼叫的方法:藉此機會將要儲存的檔案上傳到fastdfs :param name: 要儲存的檔案的名字 :param content: 要儲存的檔案物件,是File型別的物件,需要呼叫read()讀取出裡面的檔案內容二進位制 :return: file_id """ # 建立fdfs客戶端 # client = Fdfs_client('meiduo_mall/utils/fastdfs/client.conf') client = Fdfs_client(self.client_conf) # 呼叫上傳的方法:upload_by_buffer()是使用檔案的二進位制上傳的 ret = client.upload_by_buffer(content.read()) # 判斷檔案上傳是否成功 if ret.get('Status') != 'Upload successed.': raise Exception('fastfds upload error') # 如果上傳成功就將file_id返回出去 file_id = ret.get('Remote file_id') # 本次return會將file_id自動的儲存到ImageField欄位對應的模型屬性中,並自動的同步到資料庫 return file_id def exists(self, name): """告訴Django檔案是否存在 本次的檔案的儲存需要轉存到fastdfs,不需要在本地儲存,所以每次要儲存某個檔案時,都需要返回False 返回False,是告訴Django本地沒有的,那麼Django才會去儲存,才會去呼叫save()方法 """ return False def url(self, name): """ 需要在這個方法中,拼接檔案的全路徑,用於將來做檔案的下載的 <img src="{{ content.image.url }}"> :param name: 檔案的名字:group1/M00/00/00/wKhnhFtWKcOAcNjGAAC4j90Tziw97.jpeg :return: 檔案的全路徑:http://192.168.103.132:8888/group1/M00/00/00/wKhnhFtWKcOAcNjGAAC4j90Tziw97.jpeg """ # return 'http://192.168.103.132:8888/' + name return self.base_url + name