TinyWebServer开源项目学习

TinyWebServer开源项目学习

  • 学习路线
  • 上传文件
  • 下载文件

原项目地址https://github.com/qinguoyi/TinyWebServer

学习路线

学习web服务器的相关知识,不需要全部了解,但是大部分代码都得理清脉络,于是我就采用了这种方式来学习:

  1. 代码架构,每一个目录负责什么模块(这个部分可以结合开源项目的文档,可以加快对项目的理解速度)
  2. 编译运行,看看有什么功能;
  3. 挑某一个功能,细究其代码实现,我就先挑“用户登录注册”功能来进行研究,再考虑其他的功能;
  4. 添加功能,如何在现有的框架下增加一个功能?比如上传文件、上传博客等等?添加留言板?
  5. 未完…

上传文件

前端采用form

<form method="post" action="9" enctype="multipart/form-data">
        请选择文件:<input type="file" name="fileData"><br>
        请输入文件描述:<input type="text" name="fileDescription"><br>
        <input type="submit" value="提交">
form>

后端在解析消息体时进行判断并存储文件

case CHECK_STATE_CONTENT://解析消息体
        {
            if (m_method == POST && strstr(m_content_Type, "multipart/form-data"))
            {
                LOG_INFO("body :: %s", text);
                // parseFormData();
                string body, filename;
                body = text;
			    size_t st = 0, ed = 0;
                ed = body.find("\r\n");
                string boundary = body.substr(0, ed);
                // 解析文件信息
                st = body.find("filename=\"", ed) + strlen("filename=\"");
                ed = body.find("\"", st);
                filename = body.substr(st, ed - st);

                // 解析文件内容,文件内容以\r\n\r\n开始
                st = body.find("\r\n\r\n", ed) + strlen("\r\n\r\n");
                ed = body.find(boundary, st) - 2; // 文件结尾也有\r\n
                string content = body.substr(st, ed - st);

                LOG_INFO("upload file!");
                ofstream ofs;
                ofs.open("response.txt", ios::ate);
                ofs << "./files/" << filename << body;
                ofs.close();
                // path = "/response.txt";
            }
            ret = parse_content(text);
            if (ret == GET_REQUEST)
                return do_request();
            line_status = LINE_OPEN;
            break;
        }

TinyWebServer开源项目学习_第1张图片

下载文件

前端采用 标签的形式进行,通过触发“a标签” 的 download 属性进行文件的下载TinyWebServer开源项目学习_第2张图片

你可能感兴趣的:(服务,学习,c++,后端,ubuntu)