-
Notifications
You must be signed in to change notification settings - Fork 0
/
upload.cpp
67 lines (56 loc) · 2.25 KB
/
upload.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include <stdlib.h>
#include <string.h>
#include <alloca.h>
#include <fcgiapp.h>
#include <syslog.h>
#include "Parser.h"
#define printf(...) FCGX_FPrintF(request->out, __VA_ARGS__)
#define get_param(KEY) FCGX_GetParam(KEY, request->envp)
void handle_request(FCGX_Request *request) {
char *value;
printf("Content-Type: text/plain\n\n");
const char* content_type = get_param("CONTENT_TYPE");
const char* content_len = get_param("CONTENT_LENGTH");
int content_length = strtol(content_len,NULL,10);
int max_temp_buf_size =(int)(1024*1024*0.1);
int temp_buf_size = content_length < max_temp_buf_size ? content_length:max_temp_buf_size;
char* temp_buf = new char[temp_buf_size+1];
const char* multipart_form_data = "multipart/form-data;";
int multipart_form_data_len = (int)strlen(multipart_form_data);
MPFD::Parser *POSTParser = new MPFD::Parser();
POSTParser->SetContentType(content_type);
POSTParser->SetUploadedFilesStorage(MPFD::Parser::StoreUploadedFilesInFilesystem);
POSTParser->SetTempDirForFileUpload("/tmp");
for (int cur_len; (cur_len = FCGX_GetStr(temp_buf,temp_buf_size,request->in))>0;)
{
POSTParser->AcceptSomeData(temp_buf,cur_len);
}
delete[] temp_buf;
temp_buf = NULL;
std::map<std::string,MPFD::Field *> fields=POSTParser->GetFieldsMap();
std::map<std::string,MPFD::Field *>::iterator it;
for (it=fields.begin(); it != fields.end(); it++)
{
MPFD::Field* field = fields[it->first];
if (fields[it->first]->GetType()==MPFD::Field::TextType)
{
printf("field_type:%s",fields[it->first]->GetTextTypeContent().c_str());
}
else
{
printf("file_name:%s",fields[it->first]->GetFileName().c_str());
printf("\n");
printf("temp_file_name:%s",fields[it->first]->GetTempFileName().c_str());
}
}
}
int main(void) {
FCGX_Request request;
FCGX_Init();
FCGX_InitRequest(&request, 0, 0);
while (FCGX_Accept_r(&request) >= 0) {
handle_request(&request);
FCGX_Finish_r(&request);
}
return EXIT_SUCCESS;
}