如何在不下载的情况下从 python http.server POST 请求中读取图像

How to read image from python http.server POST requests without downloading

我是 pythonhttp.server 的新手,我正在做一个简单的 API 允许客户端 post 图像和服务器可以对该图像做一些事情。

下面是我的do_POST方法:

class Server(BaseHTTPRequestHandler):
    def do_POST(self):
        self.path = '/upload'
        content_length = int(self.headers['Content-Length'])
        file_content = self.rfile.read(content_length)
        #do something with the image here

        #response
        response = f'Message:'
        self.send_response(200) #create header
        self.send_header("Content-Length", str(len(response)))
        self.end_headers()

和我的要求:

r = requests.post('http://127.0.0.1:8000/upload', files = {'image': open('C:/Users/Hp/IMG20220315112838.jpg','rb')})

然而,file_content 还包含图像的元数据和其他类似信息: b'--ecd5d189dbf1c44dd325bf7134f386eb\r\nContent-Disposition: 表单数据;名称=“图像”;文件名="IMG20220315112838.jpg"\r\n\r\n\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x00\x00\x01\x00\x01\x00\x00\xff\xe1\x02\xe8Exif\x00\x00II*\x00\x08\x00\x00\x00\x0b\x00\x00\x01\x03\x00\x01\x00\x00\x00@\x07\x00\x00\x01\x01\x03\x00\x01\x00\x00\x00\xc0\x0f\x00\x00\x0f\x01\x02\x00\x05\x00\x00\x00\xa2\x00\x00\x00\x10\x01\x02\x00\r\x00\x00\x00\xa8\x00\x00\x00\x12\x01\x03\x00\x01\x00\x00\x00\x0

我的问题是如何获取唯一图像的字节以与 cv2.imshow() 之类的东西一起使用? 另一个小问题是如何处理多张图片上传,例如

r = requests.post('http://127.0.0.1:8000/upload', files = {
'image1': open('C:/Users/Hp/IMG20220315112838.jpg','rb'), 
'image2': open('C:/Users/Hp/IMG123456789.jpg','rb'), })

非常感谢您的帮助。 Edit1:我试过 file_content.decode('UTF-8') 但它打印出错误: 'utf-8' 编解码器无法解码位置 118 中的字节 0xff 位置 118 恰好在文件名字符串之后。

我在回答我自己的问题: 我尝试了 requests-toolbelt 解析器来获取如下数据:

from requests_toolbelt.multipart import decoder
class Server(BaseHTTPRequestHandler):
    def do_POST(self):
        self.path = '/upload'
        content_length = int(self.headers['Content-Length'])

        #get data content bytes
        file_content = self.rfile.read(content_length)

        #Use multipart parser to strip boundary
        multipart_data = decoder.MultipartDecoder(file_content, self.headers['Content-Type']).parts
        image_byte = multipart_data[0].content
        #Read image using cv2
        image_numpy = np.frombuffer(image_byte, np.int8)
        img = cv2.imdecode(image_numpy, cv2.IMREAD_UNCHANGED)

        #Send response
        response = bytes('Message: Successesesese', 'utf-8')
        self.send_response(200) #create header
        self.send_header("Content-Length", str(len(response)))
        self.end_headers()
        self.wfile.write(response)