django-自定義文件上傳存儲類


文件儲存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

添加圖片看效果

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM