HTTPServer接收并保存图片或文件

导入所需的库

from http.server import HTTPServer, BaseHTTPRequestHandler
import json
import socket
import cgi
from cgi import parse_header, parse_multipart
import urllib.request
import io,shutil
import re

创建Request类处理HTTP请求

class Resquest(BaseHTTPRequestHandler):
    def handler(self):
        print("data:", self.rfile.readline().decode())
        self.wfile.write(self.rfile.readline())

    def do_GET(self):        # 处理get请求
        print(self.requestline)
        if self.path != '/hello':
            self.send_error(404, "Page not Found!")
            return

        data = {
            'result_code': '1',
            'result_desc': 'Success',
            'timestamp': '',
            'data': {'message_id': 
                 '25d55ad283aa400af464c76d713c07ad'}
                        }
        self.send_response(200)
        self.send_header('Content-type', 'application/json')
        self.end_headers()
        self.wfile.write(json.dumps(data).encode())

    def do_POST(self):         # 处理post请求
        length = int(self.headers['content-length'])
        req_data = self.rfile.read(length)    # 读取所有http请求报文
        print(self.headers)        # 请求头信息
        print(self.command)      # 请求方式
        # 使用re解析出http请求中的图片,图片为字节类型
        # 图片数据需要去除httpserver加进去的form-data的边界线和文件的描述信息
        # 本例使用re去除boundary和文件描述的key:value  
        pattern1 = re.compile(b"-+w*s{2}(.*?s{2}){2}s{2}")
        pattern2 = re.compile(b"s{2}-+.+s{2}")
        res1 = re.match(pattern1, req_data)
        res2 = re.search(pattern2, req_data)
        file_data = req_data[res1.end():res2.start()]  

        # 将解析出的文件字节, 保存到本地
        with open("xx.jpg", "wb") as w:
            w.write(file_data)       

        data = {
                'result_code': '2',
                'result_desc': 'Success',
                'timestamp': '',
                'data': {'message_id': 
                            '25d55ad283aa400af464c76d713c07ad'}
                           }
        # 返回响应报文
        self.send_response(200)   # 响应行
        self.send_header('Content-type', 'application/json') # 响应头
        self.end_headers()  # 空行
        self.wfile.write(json.dumps(data).encode('utf-8'))   # 响应体                    

启动服务端

if __name__ == '__main__':
    host = ('127.0.0.1', 9002)
    server = HTTPServer(host, Resquest)
    print("Starting server, listen at: %s:%s" % host)
    server.serve_forever()

使用postman往服务器发图片

后台成功接收, 并保存图片

原文地址:https://www.cnblogs.com/draven123/p/11379061.html