隨筆-40  評論-66  文章-0  trackbacks-0
          我們來看看到底如何從POST表單收集數據到CGI程序,下面給出了一個比較簡單的C源代碼:     
              
           

           

          #include<stdio.h>
          #include<stdlib.h>    
          #define MAXLEN 80    
          #define EXTRA 5
          /*   4個字節留給字段的名字"data",   1個字節留給"="   */
          #define   MAXINPUT   MAXLEN+EXTRA+2 
          /*   1個字節留給換行符,還有一個留給后面的NULL   */
          #define DATAFILE "../data/data.txt"
          /*   要被添加數據的文件   */

          void   unencode(char   *src,   char   *last,   char   *dest)
          {
           for(; src != last; src++, dest++)
            if(*src == "+")
             *dest = " ";
            else if(*src == "%") {    
             int   code;    
             if(sscanf(src+1,"%2x",&code)!=1)code="?";
             *dest=code;
             src   +=2;}
            else
             *dest=*src;
            *dest=" ";
            *++dest="";    
          }    

          int   main(void)    
          {    
           char *lenstr;
           char input[MAXINPUT], data[MAXINPUT];
           long len;
           
           printf("%s%c%c", "Content-Type:text/html;charset=gb2312",13,10);
           printf("<TITLE>Response</TITLE>");

           lenstr=getenv("CONTENT_LENGTH");
           if(lenstr==NULL || sscanf(lenstr,"%ld",&len)!=1 || len>MAXLEN)
            printf("<P>表單提交錯誤");
           else{
            FILE *f;
            fgets(input,   len+1,   stdin);
            unencode(input+EXTRA,   input+len,   data);

            f =fopen(DATAFILE, "a");
            if(f == NULL)    
             printf("<P>對不起,意外錯誤,不能夠保存你的數據");    
            else
             fputs(data,   f);    
            fclose(f);
            printf("<P>非常感謝,您的數據已經被保存<BR>%s",data);    
           }    
           return   0;    
          }    

              
                 從本質上來看,程序先從CONTENT_LENGTH環境變量中得到數據的字長,然后讀取相應長度的字符串。因為數據內容在傳輸的過程中是經過了編碼的,所以必須進行相應的解碼。編碼的規則很簡單,主要的有這幾條:     

          1.   表單中每個每個字段用字段名后跟等號,再接上上這個字段的值來表示,每個字段之間的內容用&連結;    2.   所有的空格符號用加號代替,所以在編碼碼段中出現空格是非法的;    
          3.   特殊的字符比如標點符號,和一些有特定意義的字符如“+”,用百分號后跟其對應的ACSII碼值來表示。    

          例如:如果用戶輸入的是:     
             
          Hello   there!    

          那么數據傳送到服務器的時候經過編碼,就變成了data=Hello+there%21   上面的unencode()函數就是用來把編碼后的數據進行解碼的。在解碼完成后,數據被添加到data.txt文件的尾部,并在瀏覽其中回顯出來。    

          把文件編譯完成后,把它改名為collect.cgi后放在CGI目錄中就可以被表單調用了。下面給出了其相應的表單:    

          <FORM   ACTION="/cgi-bin/collect.cgi"   METHOD="POST"   >
          <P>請輸入您的留言(最多80個字符):<BR>
          <INPUT   NAME="data"   SIZE="60"   MAXLENGTH="80"   ><BR>
          <INPUT   TYPE="SUBMIT"   VALUE="確定">
          </FORM   >    
             
             
                 事實上,這個程序只能作為例子,是不能夠正式的使用的。它漏掉了很關鍵的一個問題:當有多個用戶同時像文件寫入數據是,肯定會有錯誤發生。而對于一個這樣的程序而言,文件被同時寫入的幾率是很大的。因此,在比較正式的留言版程序中,都需要做一些更多的考慮,比如加入一個信號量,或者是借助于一個鑰匙文件等。因為那只是編程的技巧問題,在這兒就不多說了。

          posted on 2008-02-27 13:52 Super·shen BLOG 閱讀(2779) 評論(1)  編輯  收藏

          評論:
          # re: C語言CGI程序 POST表單處理 2008-06-06 19:23 | fdsafd
          fdafds  回復  更多評論
            

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           

          ①主動出擊,馬上行動
          ②每年100本書以上
          ③一輩子在推銷自己
          ④形象 良好的態度
          ⑤非常明確自己想要的是什么。
          ⑥連續15年拜訪一個顧客,連續15年主動出擊
          ⑦成功 = 知識+人脈
          ⑧六出祁山,那是責任。
          <2008年2月>
          272829303112
          3456789
          10111213141516
          17181920212223
          2425262728291
          2345678

          常用鏈接

          留言簿(6)

          隨筆分類(28)

          隨筆檔案(40)

          文章分類

          個人主頁

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 益阳市| 广灵县| 文成县| 潮安县| 钟祥市| 宜都市| 阿拉善左旗| 松桃| 大英县| 兴安盟| 固阳县| 清新县| 文山县| 盐津县| 城口县| 乐平市| 永嘉县| 永福县| 南乐县| 沁源县| 武胜县| 五大连池市| 新乐市| 剑阁县| 饶河县| 会理县| 扎赉特旗| 来宾市| 航空| 芜湖市| 岫岩| 昆山市| 深州市| 孝感市| 泽州县| 青阳县| 湘潭市| 武定县| 武山县| 丹阳市| 东阳市|