django二次開發對接FastDFS


項目上傳和下載圖片流程

django admin的ImageField默認會把文件存到settings.py配置的MEDIA_ROOT目錄下,所以存儲圖片的數量受限於django服務器的硬盤大小。為了支持海量的圖片存儲,
更易於拓展存儲空間,使用FastDFS分布式存儲系統。如果用戶上傳的文件重復(文件指紋一樣),那么系統只有存儲一份數據。

在文件存儲服務器使用nginx支持大量用戶請求

nginx對接FastDFS的簡要配置

server {
            listen       8888;
            server_name  localhost;
            location ~/group[0-9]/ {
                ngx_fastdfs_module;
            }
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
            root   html;
            }
        }

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://127.0.0.1:8888/'

自定義文件存儲類

from django.core.files.storage import Storage
from django.conf import settings
from fdfs_client.client import Fdfs_client

class FDFSStorage(Storage):
    '''fast dfs文件存儲類'''
    def __init__(self, client_conf=None, base_url=None):
        '''初始化'''
        if client_conf is None:
            client_conf = settings.FDFS_CLIENT_CONF
        self.client_conf = client_conf

        if base_url is None:
            base_url = settings.FDFS_URL
        self.base_url = base_url

    def _open(self, name, mode='rb'):
        '''打開文件時使用'''
        pass

    def _save(self, name, content):
        '''保存文件時使用'''
        # name:你選擇上傳文件的名字 test.jpg
        # content:包含你上傳文件內容的File對象

        # 創建一個Fdfs_client對象
        client = Fdfs_client(self.client_conf)

        # 上傳文件到fast dfs系統中
        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
        # }
        if res.get('Status') != 'Upload successed.':
            # 上傳失敗
            raise Exception('上傳文件到fast dfs失敗')

        # 獲取返回的文件ID
        filename = res.get('Remote file_id')

        return filename

    def exists(self, name):
        '''Django判斷文件名是否可用,返回False表示一直可用'''
        return False

    def url(self, name):
        '''返回訪問文件的url路徑,就是ImageField字段image的url屬性的值,image.url,默認的image的url是這樣的格式:'/media/001.jpg' '''
        return self.base_url + name


免責聲明!

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



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