现在有一需求,把本地某个目录下的文件,上传到FTP服务器上,并且把FTP远端文件改名,下面为python实现的代码,
#!/usr/bin/env python
# coding=UTF-8

import os,sys,ftplib,random,time
from datetime import datetime,date

backpath = '/data/xxxx'
cur_date = date.strftime(datetime.today(),'%Y-%m-%d')

class vssbackup:
        def __init__(self):
                self.sep = os.sep
                self.allfile = []
                self.file_dict = {}
                self.ftp_addr = 'xxxxxx'
                self.ftp_user = 'xxxx'
                self.ftp_pass = 'xxxx'
                self.cur_date = date.strftime(datetime.today(),'%Y-%m-%d')
        def getfile(self,path):
                for i in os.listdir(path):
                        if os.path.isdir(path+self.sep+i):
                                self.getfile(path+self.sep+i)
                        else:
                                self.allfile.append(path+self.sep+i)
        def calc_md5(self):
                if sys.version[0:3] == '2.4':
                        import    md5 as hashlib
                else:
                        import hashlib
                for file in self.allfile:
                        file_basename = os.path.basename(file)
                        calcer = hashlib.md5()
                        calcer.update(file_basename)
                        md5_value = calcer.hexdigest()
                        filelist = open('./filelist_'+self.cur_date+'.ini','ab')
                        filelist.write('%s %s\n' % (file,md5_value))
                        filelist.close()
                        self.file_dict[file] = md5_value
        def ftpput(self,path):
                ftp = ftplib.FTP()
                ftp.connect(self.ftp_addr)
                ftp.login(self.ftp_user,self.ftp_pass)
                for file in self.allfile:
                        file_handler = open(file,'rb')
                        ftp_filename = file[len(os.path.dirname(path.rstrip('/'))):]
                        dict_filename = self.file_dict[file]
                        ftp_dirname = os.path.dirname(ftp_filename).strip('/').split('/')
                        ftp_basename = os.path.basename(file)
                        for dir in ftp_dirname:
                                try:
                                        ftp.mkd(dir)
                                        ftp.cwd(dir)
                                except:
                                        ftp.cwd(dir)
                        try:
                                a = ftp.nlst(dict_filename)
                                if len(a) == 0:
                                        print 'uploading.....'+dict_filename
                                        ftp.storbinary('STOR %s' %dict_filename,file_handler,4096)
                                        file_handler.close()
                                        ftp.cwd('/')
                        except:
                                print 'uploading.....'+dict_filename
                                ftp.storbinary('STOR %s' %dict_filename,file_handler,4096)
                                file_handler.close()
                                ftp.cwd('/')
                        time.sleep(0.5)
                ftp.close()

if __name__ == '__main__':
        for path in backpath.split(','):
                a = vssbackup()
                a.getfile(path)
                a.calc_md5()
                a.ftpput(path)

这个脚本上传少量的小文件没有问题,如果一旦上传大量文件或者特别大的文件,就会抛出异常
Error [socket 104] Connection reset by peer
求大神搭救~~~~~
不知道怎么解决,现在只能改用系统命令上传文件,然后在把对应文件改名