基础环境
centos7
使用docker安装FastDFS
搜索docker 下的FastDFS镜像
docker search fastdfs
拉取fastdfs镜像
docker pull delron/fastdfs
使用docker镜像构建tracker容器(跟踪服务器,起到调度的作用)
docker run -d --network=host --name tracker -v /home/hs/docker/fastdfs/tracker:/var/fdfs delron/fastdfs tracker
使用docker镜像构建storage容器(存储服务器,提供容量和备份服务)
docker run -d --network=host --name storage -e TRACKER_SERVER=101.132.167.60:22122 -v /home/hs/docker/fastdfs/storage:/var/fdfs -e GROUP_NAME=group1 delron/fastdfs storage
进入storage容器,到storage的配置文件中配置http访问的端口,配置文件在/etc/fdfs目录下的storage.conf。
注意:此处端口默认为8888 ,使用默认端口就可以了
docker操作fastDFS的相关命令
# 查看已经启动的容器
docker container ls
# 启动或者停止tracker
docker container start/stop tracker
# 启动或者停止storage
docker container start/stop storage
基于fastDFS自定义文件存储系统
安装fastDFS客户端依赖环境
pip install py3Fdfs
pip install mutagen
pip isntall requests
在项目的triton-website/CMS/utils/路径下新建文件夹fastDFS,切换到fastDFS目录下
- 新建fastDFS的客户端配置文件triton-website/CMS/utils/fastDFS/client.conf
base_path=/root/Workspace/Projects/Work/triton-website/CMS/logs/fastDFS
tracker_server=101.132.167.60:22122
connect_timeout=30
network_timeout=60
- 自定义文件存储类:triton-website/CMS/utils/fastDFS/fastDFS_storage.py
from django.conf import settings
from django.core.files.storage import Storage
from fdfs_client.client import Fdfs_client, get_tracker_conf
from django.utils.deconstruct import deconstructible
@deconstructible
class FastDFSStorage(Storage):
"""自定义文件存储类"""
def __init__(self, base_url=None, client_conf=None):
"""
初始化
:param base_url: 用于构造图片完整路径使用,图片服务器的域名
:param client_conf: FastDFS客户端配置文件的路径
"""
if base_url is None:
base_url = settings.FDFS_URL
self.base_url = base_url
if client_conf is None:
# client_conf = get_tracker_conf(settings.FDFS_CLIENT_CONF)
client_conf = get_tracker_conf('utils/fastDFS/client.conf')
self.client_conf = client_conf
def _open(self, name, mode='rb'):
"""
用不到打开文件,此处省略
被Storage.open()调用,在打开文件时被使用。
"""
pass
def _save(self, name, content):
"""
在fastDFS中保存文件
被Storage.save()调用
name是传入的文件名
content是Django接收到的文件内容,该方法需要将content文件内容保存
:return: 返回保存到fastDFS中的文件名,会被保存到数据库对应的字段
"""
client = Fdfs_client(self.client_conf) # 创建客户端对象
# 上传文件的方法client.upload_by_filename(文件名)或client.upload_by_buffer(文件bytes数据)
ret = client.upload_by_buffer(content.read())
"""
{
'Group name': 'group1',
'Local file name': '02.png',
'Remote file_id': 'group1/M00/00/00/wKgNgF9uzVuAd7JlAAS-_JN9ZAI299.png',
'Status': 'Upload successed.',
'Storage IP': '192.168.13.128',
'Uploaded size': '303.00KB'
}
"""
if ret.get("Status") != "Upload successed.":
raise Exception("上传文件到fastDFS失败")
file_name = ret.get("Remote file_id")
return file_name.decode()
def url(self, name):
"""
返回文件的完整URL路径
:param name: 数据库中保存的文件名
:return: 完整的URL
"""
return self.base_url + name
def exists(self, name):
"""
判断文件是否存在,FastDFS可以自行解决文件的重名问题
所以此处返回False,告诉Django上传的都是新文件
:param name: 文件名
:return: False
"""
return False
修改项目的配置文件:triton-website/CMS/CMS/settings/base.py
# 添加一下内容
# 配置django使用自定义的文件存储类
DEFAULT_FILE_STORAGE = 'utils.fastDFS.fastDFS_storage.FastDFSStorage'
# FastDFS
FDFS_URL = 'http://101.132.167.60:8888/'
# FDFS_CLIENT_CONF = os.path.join(BASE_DIR, 'utils/fastDFS/client.conf')