方法一:使用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ù)制文件到指定路徑
實(shí)現(xiàn)方法:
def ftp_copy(source_ftp, source_name, target_ftp, target_name, blocksize=8192, rest=None, type='I'):
"""
復(fù)制 FTP 圖片到另一個(gè) 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