Python HttpServer服务器

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import sys
import os   #Python的标准库中的os模块包含普遍的操作系统功能  
import re   #引入正则表达式对象  
import urllib   #用于对URL进行编解码
if sys.version_info < (3, 0):  
    from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler  #导入HTTP处理相关的模块
else :
    from http.server import HTTPServer, BaseHTTPRequestHandler 
import cgi  #文件上传处理 
import base64 #base64编码
from io import BytesIO #本地文件读取

#自定义处理程序,用于处理HTTP请求  
class EasyHTTPHandler(BaseHTTPRequestHandler):

    def do_RespHtml(self, html):
        self.protocal_version = 'HTTP/1.1'  #设置协议版本  
        self.send_response(200) #设置响应状态码  
        self.send_header("Welcome", "Contect")  #设置响应头  
        self.end_headers()
        if sys.version_info >= (3, 0):  
            html = html.encode('utf-8')
        self.wfile.write(html)   #输出响应内容

    def do_ImageHtml(self, img):
        templateStr = '''
        <html>   
            <head>   
                <title>EasyHttpServer</title>
                <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />   
            </head>   
            <body>   
                <form enctype="multipart/form-data" method="post">
                    选择图片:<input type="file" name="uploadImage" id="uploadImage" accept="image/png, image/jpeg">
                    <input type="submit" value="识别">
                </form>
                <div>{0}</div>
            </body>   
        </html>
        '''.format(img)

        self.do_RespHtml(templateStr)

    def do_FileRecv(self):
        form = cgi.FieldStorage(
            fp=self.rfile,
            headers=self.headers,
            environ={'REQUEST_METHOD':'POST',
                     'CONTENT_TYPE':self.headers['Content-Type'],
                     }
        )
        imageHtml = ""
        for field in form.keys():
            field_item = form[field]
            filename = field_item.filename
            filevalue  = field_item.value
            filesize = len(filevalue)#文件大小(字节)
            #print len(filevalue)
	    #print (filename)
            ext = os.path.splitext(filename)[1] 
            if sys.version_info >= (3, 0): 
                filename = filename.encode('utf-8')
            with open(filename, 'wb') as f:
                f.write(filevalue)

            #将图片保存到内存中
            f = BytesIO()
            with open(filename, 'rb') as img:
                f.write(img.read())
            #从内存中取出bytes类型的图片
            data = f.getvalue()
            #将bytes转成base64
            data = base64.b64encode(data).decode()                     
            imageHtml += "<p> <image width='200px' src='data:image/" + ext + ";base64," + data + "'/> </p>"                        
        
        self.do_ImageHtml(imageHtml)            

    def doIndexHtml(self): 
        #获取URL
        #print 'URL=',self.path
        #页面输出模板字符串  
        templateStr = '''
        <html>   
            <head>   
                <title>EasyHttpServer</title>
                <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />   
            </head>   
            <body>   
                <form enctype="multipart/form-data" method="post">
                    选择图片:<input type="file" name="uploadImage" id="uploadImage" accept="image/png, image/jpeg">
                    <input type="submit" value="上传">
                </form>
            </body>   
        </html>
        '''
        self.do_RespHtml(templateStr)


    #处理GET请求  
    def do_GET(self):
        self.doIndexHtml()

    #处理POST请求  
    def do_POST(self):
        self.do_FileRecv()

        #启动服务函数  
def start_server(port):
        http_server = HTTPServer(('', int(port)), EasyHTTPHandler)
        http_server.serve_forever() #设置一直监听并接收请求  

#os.chdir('static')  #改变工作目录到 static 目录  
start_server(8000)  #启动服务,监听8000端口

参考链接


发布者

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注