美文网首页
2022-02-19 pyftpdlib-FTP复制文件

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

作者: 十点半的橙汁 | 来源:发表于2022-02-19 16:15 被阅读0次

    方法一:使用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复制文件

          本文链接:https://www.haomeiwen.com/subject/pzdplrtx.html