Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

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"