Uploading file has been tricky, but thankfully nowadays there's websocket to 
send blob. Here's example how to send a file.
    
    
    import os, jester, asyncdispatch, htmlgen, asyncfile, asyncstreams, streams
    import strutils
    import ws, ws/jester_extra
    
    settings:
      port = Port 3000
    
    routes:
      get "/":
        var html = """
        <script>
        function submit_file() {
          let ws = new WebSocket("ws://localhost:3000/ws-upload");
          let filedom = document.querySelector("#input-field");
          ws.onmessage = function(evnt) {
            console.log(evnt.data);
          }
          ws.onopen = function(evnt) {
            ws.send(filedom.files[0].name);
            ws.send(filedom.files[0].slice());
            ws.close();
          }
          return true;
        }
        </script>
        """
        for file in walkFiles("*.*"):
          html.add "<li>" & file & "</li>"
        html.add "<form action=\"upload\" 
method=\"post\"enctype=\"multipart/form-data\">"
        html.add "<input id=\"input-field\" type=\"file\" name=\"file\" 
value=\"file\">"
        html.add "<input type=\"button\" value=\"Submit\" 
name=\"submit-button\" onclick=\"submit_file()\">"
        html.add "</form>"
        resp(html)
      
      get "/ws-upload":
        try:
          var wsconn = await newWebSocket(request)
          await wsconn.send("send the filename")
          var fname = await wsconn.receiveStrPacket()
          var f = openAsync(fname, fmWrite)
          while wsconn.readyState == Open:
            let (op, seqbyte) = await wsconn.receivePacket()
            if op != Binary:
              resp Http400, "invalid sent format"
              wsconn.close()
              return
            var cnt = 0
            if seqbyte.len < 4096:
              await f.write seqbyte.join
              continue
            
            while cnt < (seqbyte.len-4096):
              let datastr = seqbyte[cnt .. cnt+4095].join
              cnt.inc 4096
              await f.write(datastr)
            
            wsconn.close()
          f.close()
        except:
          echo "websocket close: ", getCurrentExceptionMsg()
        resp Http200, "file uploaded"
    
    
    Run

Reply via email to