python上传ftp_python实现ftp上传下载及断点续传

#!/usr/bin/python

#encoding=utf-8

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 Exception, e:

print >> sys.stderr, "conncet failed1 - %s" % e

return (0,'conncet failed')

else:

try:

ftp.login(loginname,loginpassword)

print('login success')

except Exception, e:

print >>sys.stderr, 'login failed - %s' % e

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 >>sys.stderr, 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]) # change remote work dir

remotefile=dires[1] # remote file name

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

fsize=ftp.size(remotefile)

if fsize==0 : # localfime's site is 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 * 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

print('rsize : %d, lsize : %d' % (rsize, lsize))

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=''

try:

print(remote[1])

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

except Exception, e:

print >>sys.stderr, '----------ftp.ntransfercmd-------- : %s' % e

return

cmpsize=rsize

while True:

buf=localf.read(1024 * 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:])

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值