python实现ftp断点续传_python ftp上传下载文件,支持断点续传 | 学步园

#encoding=utf-8

'''

Created on 2012-3-14

@author: cooler

'''

from ftplib import FTP

import sys

import os.path

class MyFTP(FTP):

'''''

conncet to FTP Server

'''

def __init__(self):

print 'make a object'

def ConnectFTP(self,remoteip,remoteport,loginname,loginpassword):

ftp=MyFTP()

try:

ftp.connect(remoteip,remoteport,600)

print 'success'

except:

print "conncet failed1"

return (0,'conncet failed')

else:

try:

ftp.login(loginname,loginpassword)

print 'login success'

except:

print 'login failed'

return (0,'login failed')

else:

print 'return 1'

return (1,ftp)

def download(self,remoteHost,remotePort,loginname,loginpassword,remotePath,localPath):

#connect to the FTP Server and check the return

res = self.ConnectFTP(remoteHost,remotePort,loginname,loginpassword)

if(res[0]!=1):

print res[1]

sys.exit()

#change the remote directory and get the remote file size

ftp=res[1]

ftp.set_pasv(0)

dires = self.splitpath(remotePath)

if dires[0]:

ftp.cwd(dires[0])

remotefile=dires[1]

print dires[0]+' '+ dires[1]

fsize=ftp.size(remotefile)

if fsize==0 :

return

#check local file isn't exists and get the local file size

lsize=0L

if os.path.exists(localPath):

lsize=os.stat(localPath).st_size

if lsize >= fsize:

print 'local file is bigger or equal remote file'

return

blocksize=1024

cmpsize=lsize

ftp.voidcmd('TYPE I')

conn = ftp.transfercmd('RETR '+remotefile,lsize)

lwrite=open(localPath,'ab')

while True:

data=conn.recv(blocksize)

if not data:

break

lwrite.write(data)

cmpsize+=len(data)

print '\b'*30,'download process:%.2f%%'%(float(cmpsize)/fsize*100),

lwrite.close()

ftp.voidcmd('NOOP')

ftp.voidresp()

conn.close()

ftp.quit()

def upload(self,remotehost,remoteport,loginname,loginpassword,remotepath,localpath,callback=None):

if not os.path.exists(localpath):

print "Local file doesn't exists"

return

self.set_debuglevel(2)

res=self.ConnectFTP(remotehost,remoteport,loginname,loginpassword)

if res[0]!=1:

print res[1]

sys.exit()

ftp=res[1]

remote=self.splitpath(remotepath)

ftp.cwd(remote[0])

rsize=0L

try:

rsize=ftp.size(remote[1])

except:

pass

if (rsize==None):

rsize=0L

lsize=os.stat(localpath).st_size

if (rsize==lsize):

print 'remote filesize is equal with local'

return

if (rsize

localf=open(localpath,'rb')

localf.seek(rsize)

ftp.voidcmd('TYPE I')

datasock,esize=ftp.ntransfercmd("STOR "+remote[1],rsize)

cmpsize=rsize

while True:

buf=localf.read(1024)

if not len(buf):

print '\rno data break'

break

datasock.sendall(buf)

if callback:

callback(buf)

cmpsize+=len(buf)

print '\b'*30,'uploading %.2f%%'%(float(cmpsize)/lsize*100),

if cmpsize==lsize:

print '\rfile size equal break'

break

datasock.close()

print 'close data handle'

localf.close()

print 'close local file handle'

ftp.voidcmd('NOOP')

print 'keep alive cmd success'

ftp.voidresp()

print 'No loop cmd'

ftp.quit()

def splitpath(self,remotepath):

position=remotepath.rfind('/')

return (remotepath[:position+1],remotepath[position+1:])

if __name__=='__main__':

lf = MyFTP()

lf.ConnectFTP("192.168.100.237","21","cooler","123123")

lf.download("192.168.100.237","21","cooler","123123","/tmp/cooler/boke.rar","C:/cooler/boke.rar")

lf.upload("192.168.100.237","21","cooler","123123","/tmp/cooler/boke1.rar","C:/cooler/boke.rar")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值