方法一:使用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
网友评论