Bye Bye Moore

猫マンション建築の野望を胸に零細事業主として資本主義の荒波に漕ぎ出したアラサー男の技術メモ

Bottleで直接送りつけられる画像データを受け取る

以前の例ではformリクエストに載った画像ファイルを扱いました。
ただ、送信デバイスの都合によっては直接データを叩きつけるような奴もあります。
この場合は、どうしたらいいのでしょうか?

実際のところ

esp8266で以下のように指定URLに対し直接画像を叩き込むようなモノがあったとします。

String camera_get_data_p(const String &post_url) {
  String line = "";
  HttpClient client;
  camera_get_data(&client, [](void *ctx, uint32_t sz){
    HttpClient &client = *(HttpClient*)ctx;
    client.setHeader("Content-Type", "image/jpeg");
    client.setContentLength(sz);
    HttpResponse res = client.post_start(POST_URL);
  }, [](void *ctx, uint8_t *buf, uint16_t len){
    HttpClient &client = *(HttpClient*)ctx;
    if (client.connected()) {
      client.write(static_cast<const uint8_t*>(buf), len);

    }
  });
  client.flush();
  return "sucess";
}

これを受けるbottleの受け手は以下の通り。
"Content-Type image/jpeg"なデータはrequestのbodyに入っています。
ただ、ここデータ型はストリームタイプなので、適宜捕まえてファイル化して保存しないといけません。

@post('/img')
def receiveImg():
    timestump = strftime('%m%d%H%M%S')
    upload   = request.body
    
    with open("/tmp/img/" + timestump + ".jpeg", 'wb') as f:
      f.write(upload.read())

    return "" + timestump + ".jpeg" + "\r\n"