Simple example showing how to upload files to the server.
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <limits.h>
#ifdef _WIN32
#define PATH_SEP '\\'
#else
#define PATH_SEP '/'
#endif
#define PAGE_FORM \
"<html>" \
"<body>" \
"<form action=\"\" method=\"post\" enctype=\"multipart/form-data\">" \
"<fieldset>" \
"<legend>Choose the files:</legend>" \
"File 1: <input type=\"file\" name=\"file1\"/><br>" \
"File 2: <input type=\"file\" name=\"file2\"/><br>" \
"<input type=\"submit\"/>" \
"</fieldset>" \
"</form>" \
"</body>" \
"</html>"
#define PAGE_DONE \
"<html>" \
"<head>" \
"<title>Uploads</title>" \
"</head>" \
"<body>" \
"<strong>Uploaded files:</strong><br>" \
"%s" \
"</body>" \
"</html>"
#define CONTENT_TYPE "text/html; charset=utf-8"
const char *name;
char *str;
char errmsg[256];
int errnum;
while (upld) {
if (errnum == 0)
sg_str_printf(body,
"<li><a href=\"?file=%s\">%s</a></li>", name, name);
else {
sg_str_printf(body,
"<li><font color='red'>%s - failed - %s</font></li>",
name, errmsg);
}
}
free(str);
}
static void req_cb(__SG_UNUSED
void *cls,
struct sg_httpreq *req,
const char *file;
char path[PATH_MAX];
process_uploads(req, res);
else {
if (file) {
PATH_SEP, file);
}
} else
}
}
int main(int argc, const char *argv[]) {
uint16_t port;
if (argc != 2) {
printf("%s <PORT>\n", argv[0]);
return EXIT_FAILURE;
}
port = strtol(argv[1], NULL, 10);
return EXIT_FAILURE;
}
fprintf(stdout, "Server running at http://localhost:%d\n",
fflush(stdout);
getchar();
return EXIT_SUCCESS;
}
struct sg_httpsrv * sg_httpreq_srv(struct sg_httpreq *req)
struct sg_httpupld * sg_httpreq_uploads(struct sg_httpreq *req)
struct sg_httpsrv * sg_httpsrv_new(sg_httpreq_cb cb, void *cls) __attribute__((malloc))
bool sg_httpreq_is_uploading(struct sg_httpreq *req)
int sg_httpupld_save(struct sg_httpupld *upld, bool overwritten)
const char * sg_httpsrv_upld_dir(struct sg_httpsrv *srv)
void sg_httpsrv_free(struct sg_httpsrv *srv)
struct sg_strmap ** sg_httpreq_params(struct sg_httpreq *req)
#define sg_httpres_download(res, filename, status)
Definition sagui.h:1065
#define sg_httpres_send(res, val, content_type, status)
Definition sagui.h:1032
int sg_httpuplds_next(struct sg_httpupld **upld)
const char * sg_httpupld_name(struct sg_httpupld *upld)
bool sg_httpsrv_listen(struct sg_httpsrv *srv, uint16_t port, bool threaded)
uint16_t sg_httpsrv_port(struct sg_httpsrv *srv)
int sg_str_clear(struct sg_str *str)
int const char * sg_str_content(struct sg_str *str)
struct sg_str * sg_str_new(void) __attribute__((malloc))
void sg_str_free(struct sg_str *str)
int sg_str_printf(struct sg_str *str, const char *fmt,...) __attribute__((format(printf
const char * sg_strmap_get(struct sg_strmap *map, const char *name)
unsigned int sg_strmap_count(struct sg_strmap *map)
char * sg_strerror(int errnum, char *errmsg, size_t errlen)