python实现ftp文件上传到服务器方法

 代码如下 复制代码

#!/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()

时间: 2024-09-18 05:38:21

python实现ftp文件上传到服务器方法的相关文章

利用ASP.NET设计FTP文件上传(上)

如果要用ASP来作一个FTP文件上传的页面,我想很多人立刻就会想到要用第三方开发的组件,利用第三方的组件,虽然开发起来相对比较容易.但一般来说,免费下载的第三方的组件都有某些方面的功能限制,若要购买正版的第三方组件,对于国内的用户,花销也是一个不小的数字,就是能够承担的起,烦杂的手续也使很多人望而却步.虽然微软公司在本身的视窗系统里面也提供了一个可以用来上传文件的组件--Posting Acceptor.但用过这个组件的朋友们都有一种普遍的感觉,就是实在不好用. 现在好了,自从微软公司推出了.N

利用ASP.NET设计FTP文件上传(下)

四. 程序源代码: <% @ Import Namespace=" System.IO " %><html ><BODY ><SCRIPT LANGUAGE = "VB" RUNAT = "SERVER" > Sub UploadFile_Clicked ( Sender as Object, e as EventArgs ) Dim lstrFileName as string Dim lstrF

java实现FTP文件上传与文件下载_java

本文实例为大家分享了两种java实现FTP文件上传下载的方式,供大家参考,具体内容如下 第一种方式: package com.cloudpower.util; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import sun.net.TelnetInputStream; import sun.net.TelnetO

ASP.NET设计FTP文件上传的解决方案_实用技巧

如果要用ASP来作一个FTP文件上传的页面,我想很多人立刻就会想到要用第三方开发的组件,利用第三方的组件,虽然开发起来相对比较容易.但一般来说,免费下载的第三方的组件都有某些方面的功能限制,若要购买正版的第三方组件,对于国内的用户,花销也是一个不小的数字,就是能够承担的起,烦杂的手续也使很多人望而却步.虽然微软公司在本身的视窗系统里面也提供了一个可以用来上传文件的组件--Posting Acceptor.但用过这个组件的朋友们都有一种普遍的感觉,就是实在不好用. 现在好了,自从微软公司推出了.N

Android关于FTP文件上传和下载功能详解

本文实例为大家分享了Android九宫格图片展示的具体代码,供大家参考,具体内容如下 此篇博客为整理文章,供大家学习. 1.首先下载commons-net  jar包,可以百度下载. FTP的文件上传和下载的工具类: package ryancheng.example.progressbar; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.io.Outpu

http协议- 使用http put把本地文件上传到服务器的的时候碰到的问题

问题描述 使用http put把本地文件上传到服务器的的时候碰到的问题 各位好,我在用libcurl的接口往localhost服务器上传文件里上传文件的时候出现了下面的错误(用的机器系统是linuxmint17,搭建的服务器Apache + PHP5 + MySQL)*** We read 4257 bytes from file<!DOCTYPE HTML PUBLIC ""-//IETF//DTD HTML 2.0//EN""> 405 Method

android-Android 文件上传出错服务器却可以得到数据

问题描述 Android 文件上传出错服务器却可以得到数据 用的AsyncHttpClient 文件上传时报错:org.apache.http.client.httpresponseExcrption:not found 但是服务器那边可以得到数据

组件-如何通过页面将指定类型的文件上传到服务器指定目录?

问题描述 如何通过页面将指定类型的文件上传到服务器指定目录? 最近我们部门在做一个项目的,有大量的页面需要将指定的文件上传到服务器,且文件类型和目录可灵活定义,并且上传过程中显示上传进度,支持多文件的上传.取消.删除操作.请问有没有现成的组件可以用,如果自己写需要考虑到各浏览器的兼容问题,担心考虑的不全面,所以是否有可用的工具拿过来直接用. 解决方案 什么语言什么环境没有说. 是web的么?看看这个效果如何http://www.cnblogs.com/zengxiangzhan/archive/

asp将本地的文件上传到服务器_实用技巧

今天我们讲解如何利用asp的上传功能将本地的文件上传到服务器上. 最简系统包括下面三个文件: upload.htm                         --上传口文件,选择本地文件 uploadimg.asp                  --上传程序控制文件 upload_5xsoft.inc            --无组件上传类,此文件初学者不用学习,只要会用就可以了 upload.htm内容----上传口文件,选择本地文件 <html> <head> <