C++访问数据库向HTML传递数据

基于Tinywebserver做了些许的修改

最开始的想法就是想要将Tinywebserver设置的固定页面访问改成可以通过访问数据库,获取想要显示的图片。

		<form action="5" method="post">
 			<div align="center"><button type="submit">xxx.jpg</button></div>
                </form>
    //如果请求资源为/5,表示跳转pic
    else if (*(p + 1) == '5')
    {
        char *m_url_real = (char *)malloc(sizeof(char) * 200);
        strcpy(m_url_real, "/picture.html");
        strncpy(m_real_file + len, m_url_real, strlen(m_url_real));

        free(m_url_real);
    }

通过阅读源码,发现有关连接HTML的部分都是写在http_con.cpp中的,Tinywebserver中给定了一个按钮,去跳转显示图片的网页,提交的形式为post,设置了一个标记为5,由此将标记5传递到http_conn.cpp中,*(p+1)=5,在根目录下加入了想要跳转的页面picture.html。

但是这个地方是固定的,怎么将访问数据库得到的图片或者说图片地址传递过去呢?

单纯的修改URL,在后面加入变量是不行的,会产生NO_RESOURCE的错误。

<div align="center"><img src="./xxx.jpg" title="awsl"/></div>
    //在HTTP报文中,请求行用来说明请求类型
    //要访问的资源以及所使用的HTTP版本,其中各个部分之间通过\t或空格分隔。
    //请求行中最先含有空格和\t任一字符的位置并返回

    //strpbrk在源字符串(s1)中找出最先含有搜索字符串(s2)
    //中任一字符的位置并返回,若找不到则返回空指针
    m_url = strpbrk(text, " \t");
    //如果没有空格或\t,则报文格式有误
    if (!m_url)
    {
        return BAD_REQUEST;
    }
    //将该位置改为\0,用于将前面数据取出
    //(已读取的数据不再会匹配到\t)
    *m_url++ = '\0';

    //取出数据,并通过与GET和POST比较,以确定请求方式
    char *method = text;
    if (strcasecmp(method, "GET") == 0)
        m_method = GET;
    else if (strcasecmp(method, "POST") == 0)
    {
        m_method = POST;
        cgi = 1;
    }
    else
        return BAD_REQUEST;
    //m_url此时跳过了第一个空格或\t字符,但不知道之后是否还有
    //将m_url向后偏移,通过查找
    //继续跳过空格和\t字符,指向请求资源的第一个字符

    //strspn:检索字符串 str1 中第一个不在字符串 str2 中出现的字符下标
    //即跳过匹配的字符串片段
    m_url += strspn(m_url, " \t");

    //相同逻辑,判断HTTP版本号
    m_version = strpbrk(m_url, " \t");
    if (!m_version)
        return BAD_REQUEST;
    *m_version++ = '\0';
    m_version += strspn(m_version, " \t");
    //仅支持HTTP/1.1
    if (strcasecmp(m_version, "HTTP/1.1") != 0)
        return BAD_REQUEST;
    
    //对请求资源前7个字符进行判断
    //这里主要是有些报文的请求资源中会带有http://
    //这里需要对这种情况进行单独处理
    if (strncasecmp(m_url, "http://", 7) == 0)
    {
        m_url += 7;
        m_url = strchr(m_url, '/');
    }

    //同样增加https情况
    if (strncasecmp(m_url, "https://", 8) == 0)
    {
        m_url += 8;
        m_url = strchr(m_url, '/');
    }
    else
        //如果以上均不符合,即不是登录和注册,直接将url与网站目录拼接
        //这里的情况是welcome界面,请求服务器上的一个图片
        strncpy(m_real_file + len, m_url, FILENAME_LEN - len - 1);

实验发现,http_conn.cpp中的do_request()方法会访问两次,第一次将路径修改为需要访问的picture.html,第二次会将picture.html这部分替换成xxx.jpg这部分。

那么他是怎么做的呢?

首先他以get形式获取text字符串,大概的形式为:GET ./xxx.jpg HTTP/1.1

然后一步步解析协议和请求方式等等,最终提取出/xxx.jpg,并在do_request()的else中将xxx.jpg拼接上,那么我首先将picture.html中的图片位置设置成一个标记,比如/mysql,然后我在m_url解析结束后,判断是否和我标记的/mysql相等,如果相等,那么我将m_url改为我想要访问数据库,得到的图片地址,就能够将我自己指定的图片发过去,当然,前提是你本地要将数据库中存储的图片进行下载。

    //同样增加https情况
    if (strncasecmp(m_url, "https://", 8) == 0)
    {
        m_url += 8;
        m_url = strchr(m_url, '/');
    }

    if(strcmp(m_url, "/mysql") == 0) {
        m_url = "/2.png";//此处即可通过调用数据库获取指定的图片地址,然后将字符串赋值即可。
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值