2022-02-19 pyftpdlib-FTP复制文件

方法一:使用requests下载文件,再上传

思路:requets下载文件,然后再上传

下载文件代码:
class Download:
    def __init__(self, url: str):
        self.url = url
        self.count = 1          # 处理 FTP 一直循环读取文件的bug

    @property
    def name(self):
        if self.url:
            url_list = self.url.split('/')
            return url_list[-1]
        return ''

    def download_image(self):
        data = b''
        if not self.count:
            return data
        resp = requests.get(self.url)
        if str(resp.status_code).startswith('2'):
            context = resp.content
            data = context
        self.count -= 1
        return data

    def read(self, *args, **kwargs) -> bytes:
        """
            模拟读取本地文件
        :param args:
        :param kwargs:
        :return:
        """
        return self.download_image()

然后调用 ftp上传代码方法,传到需要的路径,完成复制

方法二:使用ftp模块下载,然后再上传

思路:使用ftp模块的上传和下载方法的组合体,完成下载数据到内存再上传到指定路径,完成复制文件到指定路径

实现方法:
   def ftp_copy(source_ftp, source_name, target_ftp, target_name, blocksize=8192, rest=None, type='I'):
        """
         复制 FTP 图片到另一个 FTP 服务器下
        :param source_ftp: 源 FTP
        :param source_name: 源图片
        :param target_ftp: 目标 FTP
        :param target_name: 目标图片
        :param blocksize:
        :param rest:
        :param type:
        :return:
        """
        target_ftp.ftp.voidcmd('TYPE I')
        target_ftp.change_path(target_name)
        target_ftp.change_path('/')
        source_ftp.change_path('/')
        with target_ftp.ftp.transfercmd('STOR ' + target_name, rest) as save_conn:
            with source_ftp.ftp.transfercmd("RETR %s" % source_name, rest) as read_conn:
                while 1:
                    data = read_conn.recv(blocksize)   # 下载文件
                    if not data:
                        break
                    save_conn.sendall(data)   # 上传文件
                # shutdown ssl layer
                if _SSLSocket is not None and isinstance(read_conn, _SSLSocket):
                    read_conn.unwrap()
            if _SSLSocket is not None and isinstance(save_conn, _SSLSocket):
                save_conn.unwrap()
        t = target_ftp.ftp.voidresp()
        s = source_ftp.ftp.voidresp()
        return t, s

你可能感兴趣的:(2022-02-19 pyftpdlib-FTP复制文件)