Python实现FTP文件传输的实例


Posted in Python onJuly 07, 2019

FTP一般流程

FTP对应PASV和PORT两种访问方式,分别为被动和主动,是针对FTP服务器端进行区分的,正常传输过程中21号端口用于指令传输,数据传输端口使用其他端口。

PASV:由客户端发起数据传输请求,服务器端返回并携带数据端口,并且服务器端开始监听此端口等待数据,为被动模式;

PORT:客户端监听端口并向服务器端发起请求,服务器端主动连接此端口进行数据传输,为主动模式。

Python实现FTP文件传输的实例

其中TYPE分两种模式,I对应二进制模式、A对应ASCII模式;

PASV为客户端发送请求,之后227为服务器端返回操作码表示成功,并且后面带有服务器端监听的端口:143x256(左移8位)+48

之后通过STOR命令进行数据下载,下载完成后返回226表示数据传输完成。

2. Python代码实现:

中文路径问题:由于FTP支持ASCII编码,Python ftplib中编码方式使用latin-1,而window默认编码方式为gbk,所以使用Python处理时需先将中文路径编码为gbk之后译码为latin-1字符;

上传下载使用storline和retrline,对应二进制使用storbinary和retrbinary。对于stor类函数后面的参数fp表示接收一个文件对象,支持read方法,一般为打开需要上传的源文件,而retr类函数后面的参数表示对于返回数据的处理方法。

从一个FTP服务器到另一个FTP服务器的数据传输:

利用本地电脑作为数据缓存,但并不将数据保存到硬盘,只在内存中存储进行数据传输;其中一端作为下载一端为数据上传。

首先登陆两个FTP服务器,transfercmd函数用于发送命令并返回已建立好连接的本地Socket,此时分别在两个本地Socket进行数据的收发即可。

在测试中发现,在发送完一个文件之后只有及时的关闭socket,21端口才会返回226,数据完成指示,这样才可以循环下一个文件,在完成之后要退出FTP。

#coding=utf-8

import ftplib,os.path,os
import socket

f1=ftplib.FTP('172.16.2.76')
f2=ftplib.FTP('172.16.25.153')


class myFTP:
    path='file/download/bbb/'
    # ftplib中编码使用latin-1
    title='版本'.encode(encoding='gbk').decode(encoding='latin-1')
    path1=path+title  
    localDir='E:\\ver\\fp\\'
    
    path2='abc/edf/'
    

    def __init__(self):
           
      try:
        f1.login('username','password')
      except ftplib.error_perm:
        print('f1 cannot loggin!')
        return

      try:
        f2.login()
      except ftplib.error_perm:
        print('f2 cannot loggin!')
        return
        
    def ftpD(self):
             
      filelist=[]
      fileLIST=[]
      filels=f1.retrlines('LIST %s'%(self.path1),callback=filelist.append)
      f1.cwd(self.path1)
      for file in filelist:
        fileAttr=file.split(' ')
        fileName=fileAttr[-1]
        fileType=fileAttr[0][0]
        if fileType=='-':
          fileLIST.append(fileName)
    
      for file in fileLIST:
        path=self.localDir+file
        f1.retrbinary('RETR %s'%(file),open(path,'wb').write)
        print('%s download.....'%(file))    
      f1.quit()
    
    def ftpU(self,fun=1):
    
      os.chdir(self.localDir)
      fileList=os.listdir()
      
      # upload file
      if fun==1:
          for file in fileList:
            path=self.path2
            f2.storbinary('STOR %s'%(path+file),open(file,'rb'))
            print('%s uploading......'%(file))
      
      #delete file
      if fun==0:
          try:
              for file in fileList:
                path=self.path2
                f2.delete(path+file)
                print('%s delete......'%(file))
          except ftplib.error_perm:
              print('no file to delete!!')
              return
      
      f2.quit()
    
    def test(self):
      
      f1.cwd(self.path1)
      f2.cwd(self.path2)
      fileList=f1.nlst()
      print(fileList)
      
      for file in fileList:
        print('transfer %s......'%(file))
        f1.voidcmd('TYPE I')
        f2.voidcmd('TYPE I')
        sock1=f1.transfercmd('RETR %s'%(file))
        sock2=f2.transfercmd('STOR %s'%(file))
    
        while 1:
      
            data=sock1.recv(1024)
            sock2.sendall(data)
            
            if len(data)==0:
              break
        # 数据发送完成后需关闭socket,服务器21端口才会有返回    
        sock1.close()
        sock2.close()
            
                          
        res1=f1.getresp()
        #print('f1 >> %s'%(res1))
        res2=f2.getresp()
        #print('f2 >> %s'%(res2))    
                   
      f1.quit()
      f2.quit()

    
if __name__=='__main__':
  ftptest=myFTP() 
  ftptest.ftpU(0)
  #ftptest.test()
  #ftptest.ftpD()
Python 相关文章推荐
python连接mysql并提交mysql事务示例
Mar 05 Python
Python Web框架Flask信号机制(signals)介绍
Jan 01 Python
动感网页相册 python编写简单文件夹内图片浏览工具
Aug 17 Python
Python正则表达式匹配中文用法示例
Jan 17 Python
用Python删除本地目录下某一时间点之前创建的所有文件的实例
Dec 14 Python
使用python进行拆分大文件的方法
Dec 10 Python
Python中常用的8种字符串操作方法
May 06 Python
python的set处理二维数组转一维数组的方法示例
May 31 Python
Python 用turtle实现用正方形画圆的例子
Nov 21 Python
Python 内置函数globals()和locals()对比详解
Dec 23 Python
Python编程中内置的NotImplemented类型的用法
Mar 23 Python
python创建字典及相关管理操作
Apr 13 Python
Python爬虫动态ip代理防止被封的方法
Jul 07 #Python
Python异常处理例题整理
Jul 07 #Python
解决pycharm下os.system执行命令返回有中文乱码的问题
Jul 07 #Python
在python中实现调用可执行文件.exe的3种方法
Jul 07 #Python
Python求两点之间的直线距离(2种实现方法)
Jul 07 #Python
对Python中画图时候的线类型详解
Jul 07 #Python
Python 3 实现定义跨模块的全局变量和使用教程
Jul 07 #Python
You might like
php带密码功能并下载远程文件保存本地指定目录 修改加强版
2010/05/16 PHP
PHP企业级应用之常见缓存技术篇
2011/01/27 PHP
详解PHP实现执行定时任务
2015/12/21 PHP
在php的yii2框架中整合hbase库的方法
2018/09/20 PHP
PHP连续签到功能实现方法详解
2019/12/04 PHP
几款极品的javascript压缩混淆工具
2007/05/16 Javascript
jQuery插件 tabBox实现代码
2010/02/09 Javascript
dojo学习第二天 ajax异步请求之绑定列表
2011/08/29 Javascript
javascript遍历控件实例详细解析
2014/01/10 Javascript
jquery ajax 局部刷新小案例
2014/02/08 Javascript
jquery跟js初始化加载的多种方法及区别介绍
2014/04/02 Javascript
js判断手机和pc端选择不同执行事件的方法
2015/01/30 Javascript
jQuery实现菜单式图片滑动切换
2015/03/14 Javascript
jQuery中的siblings用法实例分析
2015/12/24 Javascript
微信小程序(三):网络请求
2017/01/13 Javascript
微信小程序 传值取值的几种方法总结
2017/01/16 Javascript
详解angularJs中关于ng-class的三种使用方式说明
2017/06/02 Javascript
如何解决vue2.0下IE浏览器白屏问题
2018/09/13 Javascript
微信小程序实现页面跳转传递参数(实体,对象)
2019/08/12 Javascript
js实现图片跟随鼠标移动效果
2019/10/16 Javascript
json.stringify()与json.parse()的区别以及用处
2021/01/25 Javascript
Python中selenium实现文件上传所有方法整理总结
2017/04/01 Python
python实现识别手写数字 python图像识别算法
2020/03/23 Python
Pytorch加载部分预训练模型的参数实例
2019/08/18 Python
windows下Python安装、使用教程和Notepad++的使用教程
2019/10/06 Python
Anaconda的安装与虚拟环境建立
2020/11/18 Python
css3实现平移效果(transfrom:translate)的示例
2020/11/13 HTML / CSS
留学自荐信
2013/10/10 职场文书
2014领导班子四风问题查摆思想汇报
2014/09/13 职场文书
2014年第四季度入党积极分子思想汇报(十八届四中全会)
2014/11/03 职场文书
财务负责人岗位职责
2015/02/03 职场文书
2016幼儿园毕业感言
2015/12/08 职场文书
家长必看:义务教育,不得以面试 评测等名义选拔学生
2019/07/09 职场文书
高中班主任工作总结(范文)
2019/08/20 职场文书
在 Golang 中实现 Cache::remember 方法详解
2021/03/30 Python
JavaScript最完整的深浅拷贝实现方式详解
2022/02/28 Javascript