1. 程式人生 > >自定義django儲存類

自定義django儲存類

自定義檔案儲存系統

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