通过watchdog监控FTP文件夹,传输文件

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", '.')



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值