shttpd

shttpd

shttpd 上传文件后,如果想对数据处理一番,然后跳转到新的页面。正确做法是在建立开始传输文件时,回应一个完整的页面头给浏览器,然后一包一包地接收,直到接收完毕,并处理完成,再将跳转的完事web页面发送给浏览器。

web页面编码与后台编码不一致的问题

页面是gbk显示中文,但是传到后台,C中处理变成了乱码。将其改为utf-8,传到后台能成功识别,但是前台页面又变成了乱码。解决方案:https://www.cnblogs.com/Marydon20170307/p/11362559.html
linux vim 环境下,查看文件编码,发现是cp936,需要将其转化为utf-8,然后将 shttpd example.c中,返回html内容的 example.c 转化为 utf-8格式。这样web浏览器中文显示正常,数据传到后台也能正常处理

iconv 转换cp936到utf-8

1.用vim打开文件,确保下面两个步骤
vim xx.txt
set ff=unix
set fileencoding=utf-8
2.用工具iconv转换
iconv -f gbk -t utf-8 -c xx.txt -o xx.txt.o
奇怪的是,转换之后,xx.txt和转换之前并无区别。但是此时xx.txt放到web页面上竟然显示正常了

指定根目录,后续资源默认都到根目录查找

可以对shttpd主函数进行改造,直接将部分参数写死,而不是从命令行传入,这样反而简单
int main() 或者在多进程中,将其函数名改为其它,如int webServer(). 在函数入口处,即自己构造参数,模拟手工输入:

int argc=3;
char *argv[10] =
{
     "webServer", //这是服务器的名字
     "-root",     //这是干什么的?难道是权限?
     "./web",     //指定当前路径下的web为根目录
0,0,0,0,0,0,0
};

对于shttpd的某些URL,需要指定处理函数,或者转发给脚本处理。在shttpd中,都是指定函数自己解决,如:

shttpd_register_uri(ctx, "/post.html", &receive_post_from_client, (void*)data
表示对于资源 127.0.0.1/post.html 的请示,将由函数
receive_post_from_client来处理。

而这个post.html 在网页中一般是什么样子呢?
实际上就是一个 \

<

form>, 可以是shttpd自己通过shttpd_printf()返回给前端的页面,也可以是web/xx.html中的内容。

场景一:

shtpd_printf(arg, "%s", "<form id=\"upload\" method=\"post\" action=\"/post.html\" enctype=\"multipart/form-data\" >"
    "<input type=\"file\" ... />"
    "<input type=\"text\" ... />"
    "<input type=\"hidden\" ... />"    "<input type=\"submit\" ... />"
"</form>");

其中,method=”post”表示传输方式,post加密,get为明文传输。action=”/post.html”,表示资源为127.0.0.1:port/post.html,也就是说要由 receive_post_from_client 来处理,这在前面服务器启动已经注册。写成action=”post.html”效果也是同样的

场景二:

在web/目录下,存在某个html文件,xx.html中有一段代码 :

<form id="upload" method="post" action="post.html" enctype="multipart/form-data>
   <input type="file" ... />
    <input type="text" ... />
   <input type="hidden" ... />
   <input type="submit" ... />
</form>

同样,这个文件被打开的时候:127.0.0.1:port/xx.html
只要点击控件中的提交按钮,或者在其它js 函数中,执行> 了$(“#upload”).submit操作,都能达到提交效果。将数据传输到后台

shttpd中C函数可以引用 js 文件

访问shttpd首页时,默认由show_index函数,输出 html 字符串。默认的样例中,只回复了基础的http协议报文
现在要让它支持更多功能,需要继续加大输出,用C来实现webServer,显得十分臃肿笨拙。但是前端还是能勉强展示出效果。

shttpd_printf(arg, "%s",
  "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n"
  "<html>"
  "<head>"
  "<meta http-equiv='Content-Type' content='text/html;charset=utf-8' />"
  "<style>div{float:left;border:2px;solid #000}" 
     "ol{margin:5; padding:0}"
    ".div-inline{margin:0 40px}"
  "</style>"
  "<script src=\"./jquery.min.js\">      "</script>"
  "<script src=\"./otherFunction.js\">   "</script>"
  "<script src=\"./someModule.js\">      "</script>"
  "</head>"
  "<body style=\"text-align:center; background-color:#d1d1e3\" >"
  "<br/>"
  "<h1>欢迎使用shttpd服务器</h1>"
);

在这里,已经将这么多功能抽象到 js 文件中,然后通过引用的方式来使用,极大的简化了代码.
同样,还有许多CSS是C写死的,也就当封装成CSS文件来引用。

发表评论

邮箱地址不会被公开。 必填项已用*标注