`
zhouzaibao
  • 浏览: 294102 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

python 开发的通过FTP上传下载文件类

阅读更多

原创文章,转载请注明出处:http://zhouzaibao.iteye.com

   前段时间使用java写了一个支持断点续传的FTP类库,但是这个库在使用过程中还是有点问题,最近在学习python,就打算用python写一个。

    其实在使用java写的那个过程中也遇到了一些比较难解决的问题,比如说在多个ftp客户端同事向一个FTP服务器端发送上传命令,这个时候会造成线程挂起不会抛异常也不会退出,这个让我头疼的好久,现在用python写了一个,

    目前更改的类主要实现的断点下载和断点上传,欢迎大家批评指正。

#!/usr/bin/env python 
# -*- coding: gbk -*-
from ftplib import FTP
import sys
import os.path

class MyFTP(FTP):
    '''
    conncet to FTP Server
    '''
    def ConnectFTP(self,remoteip,remoteport,loginname,loginpassword):
        ftp=MyFTP()
        try:
            ftp.connect(remoteip,remoteport)
        except:
            return (0,'conncet failed')
        else:
            try:
                ftp.login(loginname,loginpassword)
            except:
                return (0,'login failed')
            else:
                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<lsize):
            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.download('127.0.0.1',21,'test','123456','/media/purecore.exe','F:\\Downloads\\software\\PureCodectemp.exe')

 

3
0
分享到:
评论
3 楼 fbbobo 2015-12-09  
    ftp.voidcmd('TYPE I') 
2 楼 zhouzaibao 2010-06-28  
zerocq 写道
ftp.size返回ftplib.error_perm: 550 SIZE not allowed in ASCII mode

请问该怎么解决

这个我没有遇到过,我看上面的提示,应该是ftp模式选择的不对
1 楼 zerocq 2010-06-23  
ftp.size返回ftplib.error_perm: 550 SIZE not allowed in ASCII mode

请问该怎么解决

相关推荐

    python从FTP上下载文件

    Python 语言可以通过 ftplib 模块来实现 FTP 客户端功能,从 FTP 服务器上下载文件。本文将详细介绍 Python 中的 FTP 操作流程和实现方法。 FTP 操作基本流程 1. 连接 FTP 服务器:使用 `FTP.connect` 方法连接到 ...

    pyinstaller+python3+FTP上传简易版本

    本项目名为"pyinstaller+python3+FTP上传简易版本",它提供了一个简单的方法来创建一个基于Python3的FTP服务器,并通过PyInstaller将其打包成独立的.exe可执行文件,以便在Windows环境中运行。 PyInstaller是Python...

    Python-python上传excel表格数据到ftp服务器

    通过学习以上步骤和实际代码,你可以掌握在Python环境中使用FTP进行文件传输的核心知识,这对于在开发中处理文件传输需求非常有用。同时,了解`ftplib`库和相关数据处理库的用法,有助于提升你在网络编程和数据处理...

    Python通过FTP上传文件

    要通过FTP上传文件,可以按照以下描述进行操作: 导入所需模块:首先,导入ftplib模块来实现FTP连接和操作。 建立FTP连接:使用ftplib模块中的FTP类创建一个FTP对象,并使用它来建立与FTP服务器的连接。需要提供...

    ftp.zip_FTP python_Python脚本_ftp上传python_python ftp_shell脚本

    `ftp.zip`这个压缩包中包含了一个名为`ftp.py`的Python脚本,它应该是一个实现了FTP文件上传功能的实用工具。 在Python中,我们可以使用内置的`ftplib`库来处理FTP通信。`ftplib`提供了一系列的方法和类,使我们...

    ftp上传下载工具类

    FTP上传下载工具类通常是指一个编程接口或代码库,为开发者提供便捷的FTP客户端功能,包括连接到FTP服务器、上传文件、下载文件以及管理远程目录等操作。 在开发中,我们可能遇到以下关键知识点: 1. FTP基本概念...

    python编的FTP下载器

    Python 编写的FTP下载器是一个基于FTP协议的实用工具,它允许用户从远程服务器上下载文件。这个下载器由两部分组成:客户端和服务端。客户端是用户与FTP服务器交互的界面,而服务端则处理来自客户端的请求并执行实际...

    Python实现FTP上传文件或文件夹实例(递归)

    主方法 `upload` 调用了之前定义的方法来实现上传功能,最后通过示例演示了如何使用该类上传文件和文件夹。 #### 四、总结 本文介绍了一个 Python 实现 FTP 上传文件或文件夹的实例,通过定义类和方法的方式,实现...

    ftp定时上传下载文件

    综上所述,实现FTP定时上传下载文件涉及多个技术层面,包括选择合适的FTP客户端库,编写执行FTP操作的脚本,设置定时任务,以及确保安全性和可靠性。理解这些知识点,就能构建出稳定可靠的FTP自动化解决方案。

    基于python开发的FTP服务器

    在IT领域,Python是一种广泛应用的编程语言,尤其在网络服务开发中,它的简洁性和...通过这个项目,开发者可以提升网络服务开发能力,对网络协议有更深入的理解,并掌握如何在Python中实现安全、高效的文件传输服务。

    FTP服务器上传下载示例类

    在本文中,我们将深入探讨FTP服务器上传下载的基本概念,并通过一个示例代码来展示其实现过程。 FTP服务器是运行FTP服务的计算机,它提供了一个平台,使得用户可以访问并操作远程文件系统。FTP客户端则是与服务器...

    python实现从ftp服务器下载文件

    Python 实现从FTP服务器下载文件是一项常见的任务,尤其在数据迁移、备份或者远程协作中非常有用。以下将详细讲解如何使用Python的`ftplib`模块来实现这一功能,并结合给出的代码片段进行解析。 首先,我们需要导入...

    python网络编程基础FTP

    该模块包含了一系列的类和方法,可以用来执行FTP的基本操作,如登录、下载、上传、更改目录、列出目录内容等。 #### 登录FTP服务器 使用`ftplib.FTP()`创建一个FTP对象后,可以通过调用`login()`方法来登录到FTP...

    python,Pyqt5 实现FTP服务器与客户端文件上传,下载

    ftplib包含了一系列的类和函数,如FTP、FTP_TLS、FTPClient等,它们可以帮助我们实现FTP服务器的基本功能,如登录验证、文件上传和下载。 首先,创建FTP服务器通常涉及以下步骤: 1. 导入ftplib模块:`import ...

    FTP上传实例(带进度条)

    在这个实例中,我们关注的是如何实现一个带有进度条的FTP文件上传功能。这个FTP上传实例提供了可视化的进度反馈,使得用户能够清晰地看到文件上传的进度,提高了用户体验。 FTP上传的核心原理是通过FTP客户端连接到...

    python实现从ftp上下载文件的实例方法

    Python中的FTP下载文件是通过内置的`ftplib`模块实现的。`ftplib`提供了FTP协议的客户端功能,使得我们可以在Python程序中方便地进行文件的上传和下载。以下是对标题和描述中所述知识点的详细解释: 1. **导入ftp...

    基于python实现的ftp客户端工具GUI编程源码

    Python中的`ftplib`模块提供了实现FTP客户端功能的基础,我们可以利用这个模块来创建连接、上传、下载和管理远程文件。 在PyCharm这样的集成开发环境中,创建FTP客户端GUI应用程序可以借助如Tkinter或PyQt这样的库...

    python实现FTP循环上传文件

    在Python中,ftplib提供了FTP客户端的功能,允许我们连接到FTP服务器,进行文件的上传、下载等操作。以下是对标题和描述中涉及的知识点的详细解释: 1. **ftplib模块**: Python的ftplib模块是标准库的一部分,它...

    python 实现简单的FTP程序

    FTP协议定义了多种命令,如`USER`、`PASS`、`LIST`、`GET`、`PUT`等,用于控制文件的上传、下载、查看目录等操作。FTP有两个主要的通道:命令通道用于传递控制信息,如用户认证、文件操作指令等;数据通道则负责实际...

    Python Socketserver实现FTP文件上传下载代码实例

    Python Socketserver库是用于创建自定义网络服务器的模块,它简化了处理客户端连接和请求的过程。...通过这个库,开发者可以轻松地实现文件上传和下载功能,以及扩展其他FTP命令,以满足特定的需求。

Global site tag (gtag.js) - Google Analytics