diff --git a/docs/Embed.md b/docs/Embed.md index ec79f9df8fc7b2a572a275bd2bead9358fa8b2b8..7a102b64cfb6a2f9df2b06b7399cbf2e9c5db573 100644 --- a/docs/Embed.md +++ b/docs/Embed.md @@ -90,6 +90,7 @@ a couple of kilobytes to the executable size, and also has some runtime penalty. Mongoose source code contains a well-commented example code, listed below: * [hello.c](https://github.com/cesanta/mongoose/blob/master/examples/hello.c) - is a minimalisting hello world example + is a minimalistic hello world example * [post.c](https://github.com/cesanta/mongoose/blob/master/examples/post.c) - shows how to handle form input + * [upload.c](https://github.com/cesanta/mongoose/blob/master/examples/post.c) + shows how to upload files diff --git a/examples/Makefile b/examples/Makefile index 9469554225d61cb6a45f9a2f14c398ac1aa75200..562d47938f3f6f9ccc39c0818e8c44ae12cbf4d6 100644 --- a/examples/Makefile +++ b/examples/Makefile @@ -23,8 +23,8 @@ all: $(CC) qcomm.c ../mongoose.c -o qcomm $(CFLAGS) $(CC) post.c ../mongoose.c -o post $(CFLAGS) $(CC) multi_threaded.c ../mongoose.c -o multi_threaded $(CFLAGS) + $(CC) upload.c ../mongoose.c -o upload $(CFLAGS) -# $(CC) upload.c ../mongoose.c -o upload $(CFLAGS) # $(CC) -DUSE_WEBSOCKET websocket.c ../mongoose.c -o $@ $(CFLAGS) # $(CC) chat.c ../mongoose.c -o chat $(CFLAGS) # $(CC) lua_dll.c ../build/lua_5.2.1.c -o $@.so $(CFLAGS) $(DLL_FLAGS) @@ -40,7 +40,8 @@ windows: $(CL) hello.c ../mongoose.c $(CLFLAGS) $(LFLAGS) $(CL) post.c ../mongoose.c $(CLFLAGS) $(LFLAGS) $(CL) multi_threaded.c ../mongoose.c $(CLFLAGS) $(LFLAGS) -# $(CL) upload.c ../mongoose.c $(CLFLAGS) $(LFLAGS) + $(CL) upload.c ../mongoose.c $(CLFLAGS) $(LFLAGS) + # $(CL) /DUSE_WEBSOCKET websocket.c ../mongoose.c $(CLFLAGS) $(LFLAGS) #$(CL) lua_dll.c $(CLFLAGS) $(DLL_FLAGS) /DLL $(LFLAGS) /SUBSYSTEM:WINDOWS /ENTRY:luaopen_lua_dll /EXPORT:luaopen_lua_dll /out:lua_dll.dll diff --git a/examples/upload.c b/examples/upload.c index 0ce0fac7c8f2670a01866606a2aa32d4214d8231..b83693952e3934c3ba2e4c6db83acf5007b8eacf 100644 --- a/examples/upload.c +++ b/examples/upload.c @@ -5,48 +5,50 @@ #include <string.h> #include "mongoose.h" -static int event_handler(struct mg_event *event) { - - if (event->type == MG_REQUEST_BEGIN) { - if (!strcmp(event->request_info->uri, "/handle_post_request")) { - char path[200]; - FILE *fp = mg_upload(event->conn, "/tmp", path, sizeof(path)); - if (fp != NULL) { - fclose(fp); - mg_printf(event->conn, "HTTP/1.0 200 OK\r\n\r\nSaved: [%s]", path); - } else { - mg_printf(event->conn, "%s", "HTTP/1.0 200 OK\r\n\r\nNo files sent"); - } - } else { - // Show HTML form. Make sure it has enctype="multipart/form-data" attr. - static const char *html_form = - "<html><body>Upload example." - "<form method=\"POST\" action=\"/handle_post_request\" " - " enctype=\"multipart/form-data\">" - "<input type=\"file\" name=\"file\" /> <br/>" - "<input type=\"submit\" value=\"Upload\" />" - "</form></body></html>"; - - mg_printf(event->conn, "HTTP/1.0 200 OK\r\n" - "Content-Length: %d\r\n" - "Content-Type: text/html\r\n\r\n%s", - (int) strlen(html_form), html_form); - } - - // Mark request as processed - return 1; +static int index_html(struct mg_connection *conn) { + const char *data; + int data_len; + char var_name[100], file_name[100]; + + mg_printf_data(conn, "%s", + "<html><body>Upload example." + "<form method=\"POST\" action=\"/handle_post_request\" " + " enctype=\"multipart/form-data\">" + "<input type=\"file\" name=\"file\" /> <br/>" + "<input type=\"submit\" value=\"Upload\" />" + "</form>"); + + if (mg_parse_multipart(conn->content, conn->content_len, + var_name, sizeof(var_name), + file_name, sizeof(file_name), + &data, &data_len) > 0) { + + mg_printf_data(conn, "%s", "Uploaded file:<pre>"); + mg_send_data(conn, data, data_len); + mg_printf_data(conn, "%s", "/pre>"); } - // All other events left unprocessed + mg_printf_data(conn, "%s", "</body></html>"); + return 1; } int main(void) { - struct mg_context *ctx; - const char *options[] = {"listening_ports", "8080", NULL}; - ctx = mg_start(options, event_handler, NULL); - getchar(); // Wait until user hits "enter" - mg_stop(ctx); + struct mg_server *server; + + // Create and configure the server + server = mg_create_server(NULL); + mg_set_option(server, "listening_port", "8080"); + mg_add_uri_handler(server, "/", index_html); + + // Serve request. Hit Ctrl-C to terminate the program + printf("Starting on port %s\n", mg_get_option(server, "listening_port")); + for (;;) { + mg_poll_server(server, 1000); + } + + // Cleanup, and free server instance + mg_destroy_server(&server); return 0; }