当使用ftplib模块上传大文件时,如果传输时间过长,服务端会断开连接,导致代码阻塞。解决的方法就是将要上传的文件拆分为多个部分,先上传第一部分,然后将剩余部分挨个续传到服务器端,每上传一部分都要重新连接FTP。
代码
from ftplib import FTP
def get_ftp():
ftp.connect(ip, port)
ftp.login(username, password)
return ftp
bufsize = 1024 * 1024
fp = open('20240716-node1.csv', 'rb')
filesize = fp.seek(0, 2) # 获取文件大小
fp.seek(0) # 将指针调回到初始位置
# 上传第一部分文件
ftp = get_ftp()
content = fp.read(10 * bufsize) # 将文件分成每10M为一片
if content:
part_fn = 'noderank.part0'
with open(part_fn, 'wb') as part_file:
part_file.write(content)
ftp.storbinary('STOR 20240716-node1.csv', open(part_fn, 'rb'), bufsize)
ftp.quit()
# 续传剩余部分
for start in range(10 * bufsize, filesize, 10 * bufsize):
ftp = get_ftp()
content = fp.read(10 * bufsize)
if content:
part_fn = f'noderank.part{start // 10 / bufsize}'
with open(part_fn, 'wb') as part_file:
part_file.write(content)
ftp.storbinary('APPE 20240716-node1.csv', open(part_fn, 'rb'), bufsize)
ftp.quit()
fp.close()