我是python和http.server的新手,我正在做一個簡單的 API,它允許客戶端發布影像,服務器可以使用該影像做一些事情。
下面是我的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: form-data; 名稱=“影像”;檔案名="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 正好在檔案名字串之后。
uj5u.com熱心網友回復:
我在回答我自己的問題:我嘗試了 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)
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/453847.html
標籤:Python http 简单的http服务器
下一篇:使用laravel上傳檔案
