static FILE* _CreateTmpFile(const char* pFileName)
{
char sFilePathName[256] = { 0 };
sprintf(sFilePathName, "%s%s", UPLOAD_FILES_PATH, pFileName);
if (0 == access(sFilePathName, F_OK))
{
remove(sFilePathName);
}
printf("=============create upload file name:%s\n", sFilePathName);
return fopen(sFilePathName, "ab");
}
void HttpServer::OnHttpEvent(mg_connection *connection, int event_type, void *event_data)
{
http_message *http_req = (http_message *)event_data;
struct file_writer_data *data = (struct file_writer_data *) connection->user_data;
struct mg_http_multipart_part *mp = (struct mg_http_multipart_part *) event_data;
switch (event_type)
{
case MG_EV_HTTP_REQUEST:
HandleEvent(connection, http_req);
break;
case MG_EV_HTTP_PART_BEGIN:
if (NULL == data)
{
data = new struct file_writer_data;
}
//创建文件
data->fp = _CreateTmpFile(mp->file_name);
if (NULL == data->fp)
{
mg_printf(connection, "%s",
"HTTP/1.1 500 Failed to open a file\r\n"
"Content-Length: 0\r\n\r\n");
connection->flags |= MG_F_SEND_AND_CLOSE;
delete data;
return;
}
//初始化文件长度为0
data->bytes_written = 0;
connection->user_data = (void*)data;
break;
case MG_EV_HTTP_PART_DATA:
if (fwrite(mp->data.p, 1, mp->data.len, data->fp) != mp->data.len) {
mg_printf(connection, "%s",
"HTTP/1.1 500 Failed to write to a file\r\n"
"Content-Length: 0\r\n\r\n");
connection->flags |= MG_F_SEND_AND_CLOSE;
return;
}
data->bytes_written += mp->data.len;
break;
case MG_EV_HTTP_PART_END:
printf("=============upload MG_EV_HTTP_PART_END \n");
mg_printf(connection,
"HTTP/1.1 200 OK\r\n"
"Content-Type: text/plain\r\n"
"Connection: close\r\n\r\n"
"Written %ld of POST data to a temp file\n\n",
(long)ftell(data->fp));
connection->flags |= MG_F_SEND_AND_CLOSE;
fclose(data->fp);
delete data;
data = NULL;
connection->user_data = NULL;
break;
default:
break;
}
}
./curl --form "fileupload=@1.lpg" http://10.0.192.87/tmp/