FastDFS分布式文件管理系统

安装FastDFS

FastDFS分为服务端和客户端

客户端我们使用py3fdfs对fastdfs进行调用

服务端文件:fastdfs_docker.tar本机的文件直接拉到服务器端

直接docker加载文件:

docker load -i fastdfs_docker.tar

此时,docker镜像文件中就有了delron/fastdfs 的镜像文件

FastDFS有需要运行两个docker容器,一个作为tracker服务器,一个作为storage服务器

docker run -dti --network=host --name tracker -v /var/fdfs/tracker:/var/fdfs delron/fastdfs tracker

docker run -dti --network=host --name storage -e TRACKER_SERVER=192.168.17.128:22122 -v /var/fdfs/storage:/var/fdfs delron/fastdfs storage

 

通过python调用fastdfs

1.下载py3fdfs

pip install py3fdfs

2.配置文件

复制代码
# connect timeout in seconds
# default value is 30s
connect_timeout=30

# network timeout in seconds
# default value is 30s
network_timeout=60

# the base path to store log files
# fdfs日志存放位置 base_path
= magic_mall/logs # tracker_server can ocur more than once, and tracker_server format is # "host:port", host can be hostname or ip address
# fdfs服务器地址及端口 tracker_server
=192.168.17.128:22122 #standard log level as syslog, case insensitive, value list: ### emerg for emergency ### alert ### crit for critical ### error ### warn for warning ### notice ### info ### debug log_level=info # if use connection pool # default value is false # since V4.05 use_connection_pool = false # connections whose the idle time exceeds this time will be closed # unit: second # default value is 3600 # since V4.05 connection_pool_max_idle_time = 3600 # if load FastDFS parameters from tracker server # since V4.05 # default value is false load_fdfs_parameters_from_tracker=false # if use storage ID instead of IP address # same as tracker.conf # valid only when load_fdfs_parameters_from_tracker is false # default value is false # since V4.05 use_storage_id = false # specify storage ids filename, can use relative or absolute path # same as tracker.conf # valid only when load_fdfs_parameters_from_tracker is false # since V4.05 storage_ids_filename = storage_ids.conf #HTTP settings http.tracker_server_port=80 #use "#include" directive to include HTTP other settiongs ##include http.conf
复制代码

3.调用接口

复制代码
from fdfs_client.client import get_tracker_conf, Fdfs_client

tracker_conf = get_tracker_conf('./fastfdfs_client.conf')
client = Fdfs_client(tracker_conf)

#文件上传
result = client.upload_by_filename('./static/1.txt')
print(result)

#文件下载
result = client.download_to_file('./test.txt', b'group1/M00/00/00/CgEeMWJGmAKAVv3tAAAADplm3rU765.txt')
print(result)

#文件删除
result = client.delete_file(b'group1/M00/00/00/CgEeMWJGmAKAVv3tAAAADplm3rU765.txt')
print(result)

#列出所有的group信息
result = client.list_all_groups()
print(result)
复制代码

上传效果图

 下载效果图

Storage重启失败

问题描述:storage容器关闭后重启失败
解决方案:这个主要是因为storage文件中记录的fdfs_storaged.pid与tracker记录的fdfs_storaged.pid不一致导致的,将storage容器中的pid文件删除可以解决这个问题。由于之前我们创建容器时将物理目录与容器目录绑定在一起,因此我们可以直接操作物理目录。

rm -rf /var/fdfs/storage/data/fdfs_storaged.pid

 

FastDFS自定义文件存储系统

复制代码
from django.core.files.storage import Storage
from fdfs_client.client import Fdfs_client,get_tracker_conf
from django.conf import settings

class FastDFSStorage(Storage):
    """自定义文件存储系统"""
    def __init__(self,client_path=None,base_url=None):
        # fastDFS客户端配置文件路径
        self.client_path = client_path or settings.FDFS_CLIENT_CONF
        # storage服务器IP:端口
        self.base_url = base_url or settings.FDFS_BASE_URL
        pass

    def _open(self,name,mode='rb'):
        '''
        用来打开文件的,我们自定义文件存储系统的目的就是为了实现存储至远程的FastDFS服务器,不需要打开文件,所以此方法重写后什么也不做pass
        :param name: 要打开的文件名
        :param mode: 打开的文件模式
        :return: None
        '''
        pass

    def _save(self,name,content):
        '''
        文件存储时调用此方法,但是此方法默认是本地存储,在此方法实现文件远程存储到FastDFS服务器
        :param name: 要上传的文件名
        :param content: 以rb模式打开的文件对象,将来通过content.read()就可以读取到文件的二进制数据
        :return: file_id
        '''
        # 1.创建FastDFS客户端
        # tracker_conf = get_tracker_conf(settings.FDFS_CLIENT_CONF)
        tracker_conf = get_tracker_conf(self.client_path)
        client = Fdfs_client(tracker_conf)
        # 2.通过客户端调用上传文件的方法上传文件到fastDFS服务器
        # client.upload_by_filename('要写文件的绝对路径') # 只能通过文件绝对路径进行上传,此方式上传的文件会有后缀
        # upload_by_buffer可以通过文件二进制数据进行上传,上传后的文件没有后缀
        ret = client.upload_by_buffer(content.read())
        # 3.判断文件是否上传成功
        if ret.get('Status') != 'Upload successed.':
            raise Exception('Upload file failed')
        # 3.1 获取file_id  新版本fastdfs返回的file_id是一个byte类型,需要decode()
        file_id = ret.get('Remote file_id').decode()
        # 4.返回file_id
        return file_id

    def exists(self, name):
        '''
        当药进行上传时,都会调用此方法判断文件是否已上传,如果没有上传才会调用save方法进行上传
        :param name:
        :return: True表示文件已存在,False表示文件不存在,需要上传
        '''
        return False

    def url(self, name):
        '''
        当需要访问图片时自动调用此方法获取图片文件的绝对路径
        :param name:要访问图片的file_id
        :return:完整的图片访问路径:storage_server IP:8888 + file_id
        '''
        return self.base_url + name
        # return settings.FDFS_BASE_URL + name
复制代码

 

posted @   EricYJChung  阅读(342)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示