Django二次开发对接FastDFS

1.自定义文件存储器类

  1. 配置文件settings中加入如下配置

# 设置Django的文件存储类、(名字固定)
DEFAULT_FILE_STORAGE='utils.fdfs.storage.FDFSStorage'

# 设置fdfs使用的client.conf文件路径(名字自己定义)
FDFS_CLIENT_CONF='./utils/fdfs/client.conf'

# 设置fdfs存储服务器上nginx的IP和端口号(名字自己定义)
FDFS_URL='http://172.16.179.131:8888/'

  1. 创建utils/fdfs 目录
    Django二次开发对接FastDFS_第1张图片
  2. storage.py文件中自定义文件存储类

FDFSStorage继承Storage,并重写_open、_save方法

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:你选择上传文件的名字
        # 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判断文件名是否可用'''
        return False

    def url(self, name):
        '''返回访问文件的url路径'''
        return self.base_url+name
        

2.项目上传图片和使用图片流程

Django二次开发对接FastDFS_第2张图片

3.FastDFS结合Nginx优点

1)海量存储,存储容量扩展方便
2)文件内容重复
3)结合Nginx提高网站提供图片的效率

你可能感兴趣的:(Django--天天生鲜)