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)頁(yè)設(shè)計(jì)及定制高端網(wǎng)站建設(shè)服務(wù),專注于企業(yè)網(wǎng)站設(shè)計(jì),高端網(wǎng)頁(yè)制作,對(duì)被動(dòng)防護(hù)網(wǎng)等多個(gè)領(lǐng)域,擁有多年的網(wǎng)站維護(hù)經(jīng)驗(yàn)。

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

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

PORT:客戶端監(jiān)聽(tīng)端口并向服務(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)聽(tīng)的端口:143x256(左移8位)+48

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

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

中文路徑問(wè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類(lèi)函數(shù)后面的參數(shù)fp表示接收一個(gè)文件對(duì)象,支持read方法,一般為打開(kāi)需要上傳的源文件,而retr類(lèi)函數(shù)后面的參數(shù)表示對(duì)于返回?cái)?shù)據(jù)的處理方法。

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

利用本地電腦作為數(shù)據(jù)緩存,但并不將數(shù)據(jù)保存到硬盤(pán),只在內(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元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎ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://muchs.cn/article24/ejsje.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供手機(jī)網(wǎng)站建設(shè)軟件開(kāi)發(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í)需注明來(lái)源: 創(chuàng)新互聯(lián)

營(yíng)銷(xiāo)型網(wǎng)站建設(shè)