python實現ftp檔案上傳到伺服器方法

來源:互聯網
上載者:User
 代碼如下 複製代碼


#!/usr/bin/env python2

# coding: utf-8
import os,socket,threading,time

#import traceback

allow_delete = False

local_ip = socket.gethostbyname(socket.gethostname())

local_port = 8888

currdir=os.path.abspath('.')

class FTPserverThread(threading.Thread):

    def __init__(self,(conn,addr)):

        self.conn=conn

        self.addr=addr

        self.basewd=currdir

        self.cwd=self.basewd

        self.rest=False

        self.pasv_mode=False

        threading.Thread.__init__(self)

 

    def run(self):

        self.conn.send('220 Welcome!rn')

        while True:

            cmd=self.conn.recv(256)

            if not cmd: break

            else:

                print 'Recieved:',cmd

                try:

                    func=getattr(self,cmd[:4].strip().upper())

                    func(cmd)

                except Exception,e:

                    print 'ERROR:',e

                    #traceback.print_exc()

                    self.conn.send('500 Sorry.rn')

 

    def SYST(self,cmd):

        self.conn.send('215 UNIX Type: L8rn')

    def OPTS(self,cmd):

        if cmd[5:-2].upper()=='UTF8 ON':

            self.conn.send('200 OK.rn')

        else:

            self.conn.send('451 Sorry.rn')

    def USER(self,cmd):

        self.conn.send('331 OK.rn')

    def PASS(self,cmd):

        self.conn.send('230 OK.rn')

        #self.conn.send('530 Incorrect.rn')

    def QUIT(self,cmd):

        self.conn.send('221 Goodbye.rn')

    def NOOP(self,cmd):

        self.conn.send('200 OK.rn')

    def TYPE(self,cmd):

        self.mode=cmd[5]

        self.conn.send('200 Binary mode.rn')

 

    def CDUP(self,cmd):

        if not os.path.samefile(self.cwd,self.basewd):

            #learn from stackoverflow

            self.cwd=os.path.abspath(os.path.join(self.cwd,'..'))

        self.conn.send('200 OK.rn')

    def PWD(self,cmd):

        cwd=os.path.relpath(self.cwd,self.basewd)

        if cwd=='.':

            cwd='/'

        else:

            cwd='/'+cwd

        self.conn.send('257 "%s"rn' % cwd)

    def CWD(self,cmd):

        chwd=cmd[4:-2]

        if chwd=='/':

            self.cwd=self.basewd

        elif chwd[0]=='/':

            self.cwd=os.path.join(self.basewd,chwd[1:])

        else:

            self.cwd=os.path.join(self.cwd,chwd)

        self.conn.send('250 OK.rn')

 

    def PORT(self,cmd):

        if self.pasv_mode:

            self.servsock.close()

            self.pasv_mode = False

        l=cmd[5:].split(',')

        self.dataAddr='.'.join(l[:4])

        self.dataPort=(int(l[4])<<8)+int(l[5])

        self.conn.send('200 Get port.rn')

 

    def PASV(self,cmd): # from http://goo.gl/3if2U

        self.pasv_mode = True

        self.servsock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

        self.servsock.bind((local_ip,0))

        self.servsock.listen(1)

        ip, port = self.servsock.getsockname()

        print 'open', ip, port

        self.conn.send('227 Entering Passive Mode (%s,%u,%u).rn' %

                (','.join(ip.split('.')), port>>8&0xFF, port&0xFF))

 

    def start_datasock(self):

        if self.pasv_mode:

            self.datasock, addr = self.servsock.accept()

            print 'connect:', addr

        else:

            self.datasock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

            self.datasock.connect((self.dataAddr,self.dataPort))

     def stop_datasock(self):

        self.datasock.close()

        if self.pasv_mode:

            self.servsock.close()

 

 

    def LIST(self,cmd):

        self.conn.send('150 Here comes the directory listing.rn')

        print 'list:', self.cwd

        self.start_datasock()

        for t in os.listdir(self.cwd):

            k=self.toListItem(os.path.join(self.cwd,t))

            self.datasock.send(k+'rn')

        self.stop_datasock()

        self.conn.send('226 Directory send OK.rn')

 

    def toListItem(self,fn):

        st=os.stat(fn)

        fullmode='rwxrwxrwx'

        mode=''

        for i in range(9):

            mode+=((st.st_mode>>(8-i))&1) and fullmode[i] or '-'

        d=(os.path.isdir(fn)) and 'd' or '-'

        ftime=time.strftime(' %b %d %H:%M ', time.gmtime(st.st_mtime))

        return d+mode+' 1 user group '+str(st.st_size)+ftime+os.path.basename(fn)

 

    def MKD(self,cmd):

        dn=os.path.join(self.cwd,cmd[4:-2])

        os.mkdir(dn)

        self.conn.send('257 Directory created.rn')

 

    def RMD(self,cmd):

        dn=os.path.join(self.cwd,cmd[4:-2])

        if allow_delete:

            os.rmdir(dn)

            self.conn.send('250 Directory deleted.rn')

        else:

            self.conn.send('450 Not allowed.rn')

 

    def DELE(self,cmd):

        fn=os.path.join(self.cwd,cmd[5:-2])

        if allow_delete:

            os.remove(fn)

            self.conn.send('250 File deleted.rn')

        else:

            self.conn.send('450 Not allowed.rn')

 

    def RNFR(self,cmd):

        self.rnfn=os.path.join(self.cwd,cmd[5:-2])

        self.conn.send('350 Ready.rn')

 

    def RNTO(self,cmd):

        fn=os.path.join(self.cwd,cmd[5:-2])

        os.rename(self.rnfn,fn)

        self.conn.send('250 File renamed.rn')

 

    def REST(self,cmd):

        self.pos=int(cmd[5:-2])

        self.rest=True

        self.conn.send('250 File position reseted.rn')

 

    def RETR(self,cmd):

        fn=os.path.join(self.cwd,cmd[5:-2])

        #fn=os.path.join(self.cwd,cmd[5:-2]).lstrip('/')

        print 'Downlowding:',fn

        if self.mode=='I':

            fi=open(fn,'rb')

        else:

            fi=open(fn,'r')

        self.conn.send('150 Opening data connection.rn')

        if self.rest:

            fi.seek(self.pos)

            self.rest=False

        data= fi.read(1024)

        self.start_datasock()

        while data:

            self.datasock.send(data)

            data=fi.read(1024)

        fi.close()

        self.stop_datasock()

        self.conn.send('226 Transfer complete.rn')

 

    def STOR(self,cmd):

        fn=os.path.join(self.cwd,cmd[5:-2])

        print 'Uplaoding:',fn

        if self.mode=='I':

            fo=open(fn,'wb')

        else:

            fo=open(fn,'w')

        self.conn.send('150 Opening data connection.rn')

        self.start_datasock()

        while True:

            data=self.datasock.recv(1024)

            if not data: break

            fo.write(data)

        fo.close()

        self.stop_datasock()

        self.conn.send('226 Transfer complete.rn')

 

class FTPserver(threading.Thread):

    def __init__(self):

        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

        self.sock.bind((local_ip,local_port))

        threading.Thread.__init__(self)

 

    def run(self):

        self.sock.listen(5)

        while True:

            th=FTPserverThread(self.sock.accept())

            th.daemon=True

            th.start()

 

    def stop(self):

        self.sock.close()

 

if __name__=='__main__':

    ftp=FTPserver()

    ftp.daemon=True

    ftp.start()

    print 'On', local_ip, ':', local_port

    raw_input('Enter to end...n')

    ftp.stop()

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.