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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通