server.py
#!/usr/bin/python3 # -*- coding:utf-8 -*- # @Author : Charlie Zhang # @Email : charlie.zhang@wiwide.com # @Time : 2021/7/15 16:20 # @Version : 1.0 # @File : server.py # @Software : PyCharm from pyftpdlib.authorizers import DummyAuthorizer from pyftpdlib.handlers import FTPHandler from pyftpdlib.servers import FTPServer from config import FTP_USER, FTP_PASSWORD, FTP_DIR, FTP_PASSIVE_PORTS # 实例化DummyAuthorizer来创建ftp用户 authorizer = DummyAuthorizer() # 参数:用户名,密码,目录,权限 authorizer.add_user(FTP_USER, FTP_PASSWORD, FTP_DIR, perm='elradfmwMT') # 匿名登录 # authorizer.add_anonymous('/home/nobody') handler = FTPHandler handler.authorizer = authorizer # Define a customized banner (string returned when client connects) handler.banner = "pyftpdlib based ftpd ready." handler.passive_ports = FTP_PASSIVE_PORTS # 参数:IP,端口,handler server = FTPServer(('127.0.0.1', 21), handler) # set a limit for connections server.max_cons = 256 server.max_cons_per_ip = 5 server.serve_forever()
client.py
#!/usr/bin/python3 # -*- coding:utf-8 -*- # @Author : Charlie Zhang # @Email : charlie.zhang@wiwide.com # @Time : 2021/7/15 16:23 # @Version : 1.0 # @File : client.py # @Software : PyCharm import ftplib import os from config import FTP_USER, FTP_PASSWORD, LOCAL_DIR class Ftp(ftplib.FTP): def __init__(self, host='127.0.0.1', user=FTP_USER, passwd=FTP_PASSWORD, acct='', timeout=1000): ftplib.FTP.__init__(self, host, user, passwd, acct, timeout) print(self.getwelcome()) # 显示ftp服务器欢迎信息 self.__ftp_dirs = None self.__ftp_files = None def __update_path(self): # 分辨是文件还是文件夹 self.__ftp_dirs = [] self.__ftp_files = [] for file in self.nlst(): try: self.cwd(file) self.cwd('..') self.__ftp_dirs.append(file) except: self.__ftp_files.append(file) def get_path(self): self.__update_path() return self.__ftp_dirs, self.__ftp_files def download_files(self, ftp_files, local_path, blocksize=8192): for ftp_file in ftp_files: self.__download(ftp_file, local_path, blocksize) def upload_files(self, local_files, ftp_path, blocksize=8192): for local_file in local_files: self.__upload(local_file, ftp_path, blocksize) def __download(self, ftp_file, local_path, blocksize=8192): local_file = os.path.join(local_path, os.path.basename(ftp_file)) u8_ftp_file = ftp_file try: print('begin __downLoad ' + ftp_file) fp = open(local_file, 'wb') self.retrbinary('RETR %s' % (u8_ftp_file), fp.write, blocksize) fp.close() print('__download ' + ftp_file + ' is end') except Exception as e: print('error: ', e) print('__download ' + ftp_file + 'is fail') def __upload(self, local_file, ftp_path, blocksize=8192): try: print('begin __upload ' + local_file) u8_ftp_file = os.path.join(ftp_path, os.path.basename(local_file)) local_file_path = os.path.join(LOCAL_DIR, local_file) fp = open(local_file_path, 'rb') self.storbinary('STOR %s' % (u8_ftp_file), fp, blocksize) fp.close() print('__upload ' + local_file + ' is end') except Exception as e: print('error: ', e) print('__upload ' + local_file + 'is fail') if __name__ == '__main__': ftp = Ftp() # dirs, files = ftp.get_path() # for dir in dirs: # print(dir) # # print('................') # for file in files: # print(file) ftp.download_files(['001F7A31AC2C_1625466411.background_1.jpg'], LOCAL_DIR) # ftp.upload_files(['001F7A31AC2C_1625466411.background_1.jpg'], '/')
config.py
#!/usr/bin/python3 # -*- coding:utf-8 -*- # @Author : Charlie Zhang # @Email : charlie.zhang@wiwide.com # @Time : 2021/7/15 16:34 # @Version : 1.0 # @File : config.py # @Software : PyCharm import os BASE_DIR = os.path.dirname(os.path.abspath(__file__)) FTP_USER = 'prod' FTP_PASSWORD = 'wiwide123' FTP_PASSIVE_PORTS = range(20050, 20060) FTP_DIR = os.path.join(BASE_DIR, 'origin') LOCAL_DIR = os.path.join(BASE_DIR, 'local')
目录结构
ftp/ |-- client.py 客户端 |-- config.py 配置文件 |-- local 本地文件目录 | `-- 001F7A31AC2C_1625466411.background_1.jpg |-- origin 远程文件目录 `-- server.py 服务端