Python實(shí)現(xiàn)FTP文件傳輸?shù)膶?shí)例-創(chuàng)新互聯(lián)

FTP一般流程

十載專注成都網(wǎng)站制作,企業(yè)網(wǎng)站設(shè)計(jì),個(gè)人網(wǎng)站制作服務(wù),為大家分享網(wǎng)站制作知識(shí)、方案,網(wǎng)站設(shè)計(jì)流程、步驟,成功服務(wù)上千家企業(yè)。為您提供網(wǎng)站建設(shè),網(wǎng)站制作,網(wǎng)頁設(shè)計(jì)及定制高端網(wǎng)站建設(shè)服務(wù),專注于企業(yè)網(wǎng)站設(shè)計(jì),高端網(wǎng)頁制作,對(duì)被動(dòng)防護(hù)網(wǎng)等多個(gè)領(lǐng)域,擁有多年的網(wǎng)站維護(hù)經(jīng)驗(yàn)。

FTP對(duì)應(yīng)PASV和PORT兩種訪問方式,分別為被動(dòng)和主動(dòng),是針對(duì)FTP服務(wù)器端進(jìn)行區(qū)分的,正常傳輸過程中21號(hào)端口用于指令傳輸,數(shù)據(jù)傳輸端口使用其他端口。

PASV:由客戶端發(fā)起數(shù)據(jù)傳輸請(qǐng)求,服務(wù)器端返回并攜帶數(shù)據(jù)端口,并且服務(wù)器端開始監(jiān)聽此端口等待數(shù)據(jù),為被動(dòng)模式;

PORT:客戶端監(jiān)聽端口并向服務(wù)器端發(fā)起請(qǐng)求,服務(wù)器端主動(dòng)連接此端口進(jìn)行數(shù)據(jù)傳輸,為主動(dòng)模式。

Python實(shí)現(xiàn)FTP文件傳輸?shù)膶?shí)例

其中TYPE分兩種模式,I對(duì)應(yīng)二進(jìn)制模式、A對(duì)應(yīng)ASCII模式;

PASV為客戶端發(fā)送請(qǐng)求,之后227為服務(wù)器端返回操作碼表示成功,并且后面帶有服務(wù)器端監(jiān)聽的端口:143x256(左移8位)+48

之后通過STOR命令進(jìn)行數(shù)據(jù)下載,下載完成后返回226表示數(shù)據(jù)傳輸完成。

2. Python代碼實(shí)現(xiàn):

中文路徑問題:由于FTP支持ASCII編碼,Python ftplib中編碼方式使用latin-1,而window默認(rèn)編碼方式為gbk,所以使用Python處理時(shí)需先將中文路徑編碼為gbk之后譯碼為latin-1字符;

上傳下載使用storline和retrline,對(duì)應(yīng)二進(jìn)制使用storbinary和retrbinary。對(duì)于stor類函數(shù)后面的參數(shù)fp表示接收一個(gè)文件對(duì)象,支持read方法,一般為打開需要上傳的源文件,而retr類函數(shù)后面的參數(shù)表示對(duì)于返回?cái)?shù)據(jù)的處理方法。

從一個(gè)FTP服務(wù)器到另一個(gè)FTP服務(wù)器的數(shù)據(jù)傳輸:

利用本地電腦作為數(shù)據(jù)緩存,但并不將數(shù)據(jù)保存到硬盤,只在內(nèi)存中存儲(chǔ)進(jìn)行數(shù)據(jù)傳輸;其中一端作為下載一端為數(shù)據(jù)上傳。

首先登陸兩個(gè)FTP服務(wù)器,transfercmd函數(shù)用于發(fā)送命令并返回已建立好連接的本地Socket,此時(shí)分別在兩個(gè)本地Socket進(jìn)行數(shù)據(jù)的收發(fā)即可。

在測(cè)試中發(fā)現(xiàn),在發(fā)送完一個(gè)文件之后只有及時(shí)的關(guān)閉socket,21端口才會(huì)返回226,數(shù)據(jù)完成指示,這樣才可以循環(huán)下一個(gè)文件,在完成之后要退出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')
    path2=path+title  
    localDir='E:\\ver\\fp\\'
    
    path3='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.path2),callback=filelist.append)
      f1.cwd(self.path2)
      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.path3
            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.path3
                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.path2)
      f2.cwd(self.path3)
      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
        # 數(shù)據(jù)發(fā)送完成后需關(guān)閉socket,服務(wù)器21端口才會(huì)有返回    
        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()

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

分享文章:Python實(shí)現(xiàn)FTP文件傳輸?shù)膶?shí)例-創(chuàng)新互聯(lián)
文章轉(zhuǎn)載:http://m.kartarina.com/article24/ejsje.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供手機(jī)網(wǎng)站建設(shè)軟件開發(fā)服務(wù)器托管網(wǎng)站設(shè)計(jì)公司商城網(wǎng)站關(guān)鍵詞優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

營銷型網(wǎng)站建設(shè)
主站蜘蛛池模板: 无码日韩精品一区二区三区免费| 日韩乱码人妻无码中文字幕久久| 精品韩国亚洲av无码不卡区| 精品无码国产污污污免费| 无码少妇A片一区二区三区| 国产成人无码精品久久久露脸| 少妇无码太爽了不卡在线观看| 伊人久久大香线蕉无码| 亚洲成A人片在线观看无码不卡| 日韩AV片无码一区二区不卡 | 免费A级毛片av无码| 精品无码人妻一区二区三区18| 亚洲中文字幕无码久久精品1| 精品人妻中文无码AV在线| 91精品无码久久久久久五月天| 国产精品无码午夜福利| 日韩少妇无码喷潮系列一二三| 亚洲av永久无码精品三区在线4| 中文字幕无码av激情不卡久久| 无码精品不卡一区二区三区| 亚洲日韩精品无码专区加勒比☆| 亚洲A∨无码一区二区三区| 亚洲AV无码一区二区三区在线观看 | 无码国内精品久久人妻麻豆按摩 | 无码精品人妻一区二区三区人妻斩 | 亚洲中文字幕无码一区| 无码专区国产无套粉嫩白浆内射 | 久久久无码精品亚洲日韩蜜臀浪潮| 无码一区二区三区在线| 无码中文在线二区免费| 国产精品无码AV天天爽播放器| 无码精品A∨在线观看十八禁| 色偷偷一区二区无码视频| 亚洲不卡中文字幕无码| 国产亚洲精品无码成人| 亚洲国产精品无码久久一线| 曰批全过程免费视频在线观看无码| 久久精品无码专区免费| 13小箩利洗澡无码视频网站免费| 韩国免费a级作爱片无码| 国产日韩AV免费无码一区二区 |