<!DOCTYPE html>
<html lang="en">
  <head>
    <title>example</title>
    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <style>
      #container { margin-right: auto; margin-left: auto; max-width: 480px; }
      #info { background: #e0f0f0; border-radius: .5em; padding: 2em;  }
      #wrapper { margin-top: 1em; }
    </style>
  </head>
  <body>
    <div id="container">
      <div id="info">
        Mongoose always buffers a full HTTP message before invoking
        MG_EV_HTTP_MSG event. Big POST request require of lot
        of RAM to buffer everything.
        <br><br>
        In order to upload large files to a memory-constrained system, use
        <code>MG_EV_HTTP_CHUNK</code> on a server side. It fires when
        a partial HTTP message has been received (or a chunk-encoded chunk).
        Use <code>mg_http_delete_chunk()</code> to release chunk memory.
        When 0-sized chunk is received, that's the end of the message.
        Use <code>MG_MAX_RECV_SIZE</code> build constant to limit
        maximum chunk size on a server side.
        <br><br>
        In this example, JavaScript code uses "fetch()" browser API.
        Uploaded file is not saved, but rather printed by server side.
      </div>
      <div id="wrapper">
        <input type="file" id="el1" style="display: none"/>
        <button id="el2">choose file...</button>
        <span>Selected file:</span> <span id="el4"></span> <br/>
        <button id="el5" style="margin: 0.5em 0;" disabled>upload file</button>
        <div id="el3" style="margin-top: 1em;"></div>
      </div>
    </div>
  </body>
  <script>
    var f; // selected file

    // When user clicks on a button, trigger file selection dialog
    document.getElementById('el2').onclick = function(ev) {
      document.getElementById('el1').click();
    };

    document.getElementById('el5').onclick = function(ev) {
      var r = new FileReader();
      r.readAsArrayBuffer(f);
      r.onload = function() {
        ev.target.value = '';
        document.getElementById('el3').innerText = 'Uploading...';
        fetch('/upload?name=' + encodeURIComponent(f.name), {
          method: 'POST',
          body: r.result,
        }).then(function(res) {
          document.getElementById('el3').innerText = 'Uploaded ' + r.result.byteLength + ' bytes';
        });
      };
    };

    // If user selected a file, read it into memory and trigger sendFileData()
    document.getElementById('el1').onchange = function(ev) {
      f = ev.target.files[0];
      if (!f) return;
      document.getElementById('el4').innerText = f.name;
      document.getElementById('el5').removeAttribute('disabled');
    };

  </script>
</html>