From 448de6a9c62dd39937cca994929bca84004db7e4 Mon Sep 17 00:00:00 2001
From: yhirose <yuji.hirose.bug@gmail.com>
Date: Thu, 28 Nov 2019 18:51:05 -0500
Subject: [PATCH] Added upload example

---
 example/Makefile  |  7 +++++--
 example/upload.cc | 49 +++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 54 insertions(+), 2 deletions(-)
 create mode 100644 example/upload.cc

diff --git a/example/Makefile b/example/Makefile
index ed67dae..28cea04 100644
--- a/example/Makefile
+++ b/example/Makefile
@@ -5,7 +5,7 @@ OPENSSL_DIR = /usr/local/opt/openssl
 OPENSSL_SUPPORT = -DCPPHTTPLIB_OPENSSL_SUPPORT -I$(OPENSSL_DIR)/include -L$(OPENSSL_DIR)/lib -lssl -lcrypto
 ZLIB_SUPPORT = -DCPPHTTPLIB_ZLIB_SUPPORT -lz
 
-all: server client hello simplesvr redirect benchmark
+all: server client hello simplesvr upload redirect benchmark
 
 server : server.cc ../httplib.h Makefile
 	$(CXX) -o server $(CXXFLAGS) server.cc $(OPENSSL_SUPPORT) $(ZLIB_SUPPORT)
@@ -19,6 +19,9 @@ hello : hello.cc ../httplib.h Makefile
 simplesvr : simplesvr.cc ../httplib.h Makefile
 	$(CXX) -o simplesvr $(CXXFLAGS) simplesvr.cc $(OPENSSL_SUPPORT) $(ZLIB_SUPPORT)
 
+upload : upload.cc ../httplib.h Makefile
+	$(CXX) -o upload $(CXXFLAGS) upload.cc $(OPENSSL_SUPPORT) $(ZLIB_SUPPORT)
+
 redirect : redirect.cc ../httplib.h Makefile
 	$(CXX) -o redirect $(CXXFLAGS) redirect.cc $(OPENSSL_SUPPORT) $(ZLIB_SUPPORT)
 
@@ -30,4 +33,4 @@ pem:
 	openssl req -new -key key.pem | openssl x509 -days 3650 -req -signkey key.pem > cert.pem
 
 clean:
-	rm server client hello simplesvr redirect *.pem
+	rm server client hello simplesvr upload redirect *.pem
diff --git a/example/upload.cc b/example/upload.cc
new file mode 100644
index 0000000..0ad9290
--- /dev/null
+++ b/example/upload.cc
@@ -0,0 +1,49 @@
+//
+//  upload.cc
+//
+//  Copyright (c) 2019 Yuji Hirose. All rights reserved.
+//  MIT License
+//
+
+#include <httplib.h>
+#include <iostream>
+#include <fstream>
+using namespace httplib;
+using namespace std;
+
+const char* html = R"(
+<form id="formElem">
+  <input type="file" name="file" accept="image/*">
+  <input type="submit">
+</form>
+<script>
+  formElem.onsubmit = async (e) => {
+    e.preventDefault();
+    let res = await fetch('/post', {
+      method: 'POST',
+      body: new FormData(formElem)
+    });
+    console.log(await res.text());
+  };
+</script>
+)";
+
+int main(void) {
+  Server svr;
+
+  svr.Get("/", [](const Request & /*req*/, Response &res) {
+    res.set_content(html, "text/html");
+  });
+
+  svr.Post("/post", [](const Request & req, Response &res) {
+    auto file = req.get_file_value("file");
+    cout << "file: " << file.offset << ":" << file.length << ":" << file.filename << endl;
+
+    ofstream ofs(file.filename, ios::binary);
+    ofs << req.body.substr(file.offset, file.length);
+
+    res.set_content("done", "text/plain");
+  });
+
+  svr.listen("localhost", 1234);
+}