この記事のソースが余りにも冗長すぎるので、書き換えました。
こんな感じです。
CONTENT_TYPE = {'.html': 'text/html; charset=utf-8', '.txt': 'text/plain; charset=utf-8', '.js': 'text/javascript', '.json': 'application/json',
'.jpeg': 'image/jpeg', '.jpg': 'image/jpeg', '.png': 'image/png', '.gif': 'image/gif',
'.css':'text/css'}
def do_GET(self):
parsed = urlparse(self.path)
if parsed.path == '/Streaming':
enc = sys.getfilesystemencoding()
_, img = cap.read()
resized_img = cv2.resize(img, (480, 320))
_, encoded_img = cv2.imencode('.jpg', resized_img, [int(cv2.IMWRITE_JPEG_QUALITY), 30])
dst_base64 = base64.b64encode(encoded_img).decode('utf-8')
data = {
'image': 'data:image/jpg;base64,' + dst_base64
}
encoded = json.dumps(data).encode()
self.send_response(HTTPStatus.OK)
self.send_header("Content-type", "text/html; charset=%s" % enc)
self.send_header("Access-Control-Allow-Origin", "null")
self.send_header("Content-Length", str(len(encoded)))
self.end_headers()
self.wfile.write(encoded)
elif parsed.path.endswith('/'):
self.send_response(HTTPStatus.OK)
with open('index.html',mode='br') as f:
data = f.read()
self.send_header("Content-type", "text/html; charset=utf-8")
self.end_headers()
self.wfile.write(bytes(data))
else:
self.send_response(HTTPStatus.OK)
filepath = '.' + parsed.path
with open(filepath, mode='br') as f:
data = f.read()
self.send_header("Content-type", CONTENT_TYPE[pathlib.Path(filepath).suffix])
self.end_headers()
self.wfile.write(bytes(data))
まず、URLが”/”の場合はindex.htmlを返します。
そして、URLが”/Streaming”の場合はカメラの映像をbase64で返します。
それ以外の場合(今回で言うと、jsファイル達)、URLで指定されたファイル名と同じファイルを返します。
ただ、その場合、content-typeを正しいものにしないとブラウザが正しく動いてくれないので、ファイル拡張子に対応する適切なcontent-typeを設定するようにしています。
それを対応づけているのがCONTENT_TYPEです。
こうすることで、今後jsファイル以外のものにも対応出来ます。
一般的なHTTPサーバに比べれば不十分ですが、今回目指しているのはそれではないので、こんなもんで十分でしょう。
ソースはgitHubに公開しました。
https://github.com/takishita2nd/RemoteCamera