2022-02-19 pyftpdlib-FTP復(fù)制文件

方法一:使用requests下載文件,再上傳

思路:requets下載文件,然后再上傳

下載文件代碼:
class Download:
    def __init__(self, url: str):
        self.url = url
        self.count = 1          # 處理 FTP 一直循環(huán)讀取文件的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()

然后調(diào)用 ftp上傳代碼方法,傳到需要的路徑,完成復(fù)制

方法二:使用ftp模塊下載,然后再上傳

思路:使用ftp模塊的上傳和下載方法的組合體,完成下載數(shù)據(jù)到內(nèi)存再上傳到指定路徑,完成復(fù)制文件到指定路徑

實現(xiàn)方法:
   def ftp_copy(source_ftp, source_name, target_ftp, target_name, blocksize=8192, rest=None, type='I'):
        """
         復(fù)制 FTP 圖片到另一個 FTP 服務(wù)器下
        :param source_ftp: 源 FTP
        :param source_name: 源圖片
        :param target_ftp: 目標(biāo) FTP
        :param target_name: 目標(biāo)圖片
        :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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容