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往服务器发图片
后台成功接收, 并保存图片