Python 에서 FTP 파일 전송 을 실현 하 는 실례

FTP 일반 프로 세 스
FTP 는 PASV 와 PORT 두 가지 접근 방식 에 대응 하 는데 각각 수 동적 이 고 주동 적 이 며 FTP 서버 단 을 대상 으로 구분 되 며 정상 적 인 전송 과정 에서 21 번 포트 는 명령 전송 에 사용 되 고 데이터 전송 포트 는 다른 포트 를 사용한다.
PASV:클 라 이언 트 가 데이터 전송 요청 을 하고 서버 측 이 데이터 포트 를 되 돌려 주 며 서버 측 이 이 포트 에서 데 이 터 를 기다 리 는 것 을 감청 하기 시작 하여 수 동적 모드 입 니 다.
PORT:클 라 이언 트 감청 포트 를 서버 측 에 요청 하고 서버 측 이 이 포트 에 주동 적 으로 연결 하여 데이터 전송 을 하 며 주동 적 인 모드 입 니 다.

그 중에서 TYPE 는 두 가지 모델 로 나 뉘 는데 I 는 바 이 너 리 모델,A 는 ASCII 모델 에 대응 합 니 다.
PASV 는 클 라 이언 트 에 게 요청 을 보 낸 후 227 은 서버 측 에 작업 코드 를 되 돌려 주 는 데 성 공 했 고 뒤에 서버 측 감청 이 있 는 포트:143 x 256(왼쪽 이동 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()

좋은 웹페이지 즐겨찾기