import ftplib
import ftputil
import sys
import os
import logging
sys.setrecursionlimit(1000000) #
class Upload:
def __init__(self):
local_ip = '192.168.56.241'
local_user = 'ftp'
local_pwd = '1'
self.logger = self.get_logger()
self.ftp = ftplib.FTP(local_ip, local_user, local_pwd)
self.ftp.encoding = 'utf-8'
ftplib.FTP.encoding = 'utf-8'
self.ftp_util = ftputil.FTPHost(local_ip, local_user, local_pwd, session_factory=ftplib.FTP)
self.ftp.set_pasv(False)
def get_logger(self):
base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # API_3
log_dir = os.path.join(base_dir, 'zwcad')
logger = logging.getLogger('transfer')
logger.setLevel('DEBUG')
fmt = "%(asctime)s - %(name)s - %(levelname)s - %(message)s - [%(filename)s:%(lineno)d ]"
formatter = logging.Formatter(fmt=fmt)
console_handler = logging.StreamHandler() # 控制台
# 把日志级别放到配置文件里面配置--优化
console_handler.setLevel('DEBUG')
console_handler.setFormatter(formatter)
file_handler = logging.FileHandler(log_dir + '/case.log')
# 把日志级别放到配置文件里面配置
file_handler.setLevel('INFO')
file_handler.setFormatter(formatter)
logger.addHandler(console_handler)
logger.addHandler(file_handler)
return logger
# 判断文件夹内容大小
def get_total_size(self, local_dir):
fileCnt = 0
fileSize = 0
dirCnt = 0
for parent, dirnames, filenames in os.walk(local_dir):
for filename in filenames:
fileCnt += 1
pathfile = os.path.join(parent, filename)
singleFileSize = os.path.getsize(pathfile)
fileSize += singleFileSize
for dirname in dirnames:
dirCnt += 1
pathdir = os.path.join(parent, dirname)
self.logger.info('\tdir: %s' % pathdir.encode(
'latin-1').decode(r'utf-8'))
return dirCnt, fileCnt
def up_load_file(self, local_dir, remote_dir):
remote_file_name = os.path.split(local_dir)[1]
remote_path = remote_dir + '/' + remote_file_name
try: # 如果文件不存在,调用file.size(filename)会报错
if self.ftp.size(remote_path) != None:
self.logger.error("文件%s已存在" % remote_path)
return
except Exception:
pass
buf_size = 1024
with open(local_dir, 'rb') as file_handler:
self.ftp.storbinary('STOR ' + remote_dir, file_handler, buf_size)
self.logger.info('文件:%s 已经上传到ftp' % local_dir)
def upload_file_tree(self, local_path, remote_path):
if not os.path.isdir(local_path):
self.logger.error('本地目录 %s 不存在' % local_path)
return
try:
self.ftp.cwd(remote_path) # 切换工作路径
except Exception as e:
base_dir, part_path = self.ftp.pwd(), remote_path.split('/')
for p in part_path[1:-1]:
base_dir = base_dir + p + '/' # 拼接子目录
try:
self.ftp.cwd(base_dir) # 切换到子目录, 不存在则异常
except Exception as e:
print('INFO:', e)
self.ftp.mkd(base_dir) # 不存在创建当前子目录
# self.ftp.cwd(remote_path)
self.logger.info('切换至远程目录: %s' % self.ftp.pwd())
local_name_list = os.listdir(local_path)
self.logger.info('本地目录list: %s' % local_name_list)
# self.debug_print('判断是否有服务器目录: %s' % os.path.isdir())
for local_name in local_name_list:
src = os.path.join(local_path, local_name)
print("src路径==========" + src)
if os.path.isdir(src):
self.ftp.mkd(local_name)
try:
self.ftp.mkd(local_name)
except Exception as err:
self.logger.info("目录已存在 %s ,具体错误描述为:%s" % (local_name, err))
self.logger.info("upload_file_tree()---> 上传目录: %s" % local_name)
self.logger.info("upload_file_tree()---> 上传src目录: %s" % src)
self.upload_file_tree(src, local_name)
else:
self.logger.info("upload_file_tree()---> 上传文件: %s" % local_name)
self.up_load_file(src, local_name)
self.ftp.cwd("..")
def up_loads(self, local_dir, remote_dir):
up_oper = Upload()
# 判断需要传输的是文件还是文件夹
# 如果是一个文件
if os.path.isfile(local_dir):
# 判断另一端FTP是否存在该路径的文件夹,如果存在
if not self.ftp_util.path.isdir(remote_dir):
self.ftp.mkd(remote_dir)
remote_dir = f'{remote_dir}/{local_dir.split("/")[-1]}' if "/" in local_dir else remote_dir
up_oper.up_load_file(local_dir, remote_dir)
# 如果是一个文件夹
elif os.path.isdir(local_dir):
self.logger.info(self.get_total_size(local_dir))
# 判断文件夹内容是否为空,如果为空
if self.get_total_size(local_dir)[0] == 0 and self.get_total_size(local_dir)[1] == 0:
self.logger.info("空文件夹")
# self.ftp2.mkd(local_dir)
# 判断文件夹内容不为空
else:
try:
if not self.ftp_util.path.isdir(remote_dir):
self.ftp.mkd(remote_dir)
if "/" in local_dir:
if remote_dir == "/":
remote_dir = ""
remote_dir = f'{remote_dir}/{local_dir.split("/")[-1]}' if "/" in local_dir else remote_dir
if not self.ftp_util.path.isdir(remote_dir):
self.ftp.mkd(remote_dir)
up_oper.upload_file_tree(local_dir, remote_dir)
except ftplib.error_perm:
pass
else:
self.logger.info("不存在该文件或文件夹")
if __name__ == '__main__':
# locale_file = sys.argv[1]
# remote_file = sys.argv[2]
# Upload().up_loads(locale_file, remote_file)
Upload().up_loads(r"D:/postgresql-14.1-1-windows-x64.exe", '.')
本地上传文件或文件夹到FTP
最新推荐文章于 2023-04-13 10:38:31 发布