2016-05-12 04:36:12 +08:00
|
|
|
---
|
|
|
|
title: "mg_file_upload_handler()"
|
|
|
|
decl_name: "mg_file_upload_handler"
|
|
|
|
symbol_kind: "func"
|
|
|
|
signature: |
|
|
|
|
void mg_file_upload_handler(struct mg_connection *nc, int ev, void *ev_data,
|
2017-03-15 08:37:45 +08:00
|
|
|
mg_fu_fname_fn local_name_fn
|
|
|
|
MG_UD_ARG(void *user_data);
|
2016-05-12 04:36:12 +08:00
|
|
|
---
|
|
|
|
|
|
|
|
File upload handler.
|
|
|
|
This handler can be used to implement file uploads with minimum code.
|
|
|
|
This handler will process MG_EV_HTTP_PART_* events and store file data into
|
|
|
|
a local file.
|
|
|
|
`local_name_fn` will be invoked with whatever name was provided by the client
|
2016-07-26 22:53:33 +08:00
|
|
|
and will expect the name of the local file to open. A return value of NULL
|
|
|
|
will abort file upload (client will get a "403 Forbidden" response). If
|
|
|
|
non-null, the returned string must be heap-allocated and will be freed by
|
|
|
|
the caller.
|
2016-05-12 04:36:12 +08:00
|
|
|
Exception: it is ok to return the same string verbatim.
|
|
|
|
|
|
|
|
Example:
|
|
|
|
|
|
|
|
```c
|
|
|
|
struct mg_str upload_fname(struct mg_connection *nc, struct mg_str fname) {
|
|
|
|
// Just return the same filename. Do not actually do this except in test!
|
|
|
|
// fname is user-controlled and needs to be sanitized.
|
|
|
|
return fname;
|
|
|
|
}
|
|
|
|
void ev_handler(struct mg_connection *nc, int ev, void *ev_data) {
|
|
|
|
switch (ev) {
|
|
|
|
...
|
|
|
|
case MG_EV_HTTP_PART_BEGIN:
|
|
|
|
case MG_EV_HTTP_PART_DATA:
|
|
|
|
case MG_EV_HTTP_PART_END:
|
|
|
|
mg_file_upload_handler(nc, ev, ev_data, upload_fname);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|