<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://www.jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>http://www.jackxiang.com/post//</link>
<title><![CDATA[[作为备案]用c语言写cgi程序实现文件上传]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[WEB2.0]]></category>
<pubDate>Sat, 04 May 2013 12:15:49 +0000</pubDate> 
<guid>http://www.jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	背景：现在很少有用C实现文件上传了，有Nginx的上传模块，用CGI实现文件上传在这里作下备案。<br/>后加参考：http://hi.baidu.com/davidgabriel/item/58fec40b4c2f49803c42e290&nbsp;&nbsp;<br/>用C语言库(CGIC)编写CGI，实现文件上传：<br/>http://hi.baidu.com/rszlatkfoxbalqd/item/62bb3a4e04e89c0fc0161326&nbsp;&nbsp;<br/>使用C语言的CGI库“CGIC”完成Web开发的各种要求 ：<br/>http://blog.sina.com.cn/s/blog_75a8cfac0100p9es.html<br/>add Time：2014-01-14<br/><br/>upload.html<br/><textarea name="code" class="C" rows="15" cols="100">
&lt;HTML&gt;
&lt;HEAD&gt;
&lt;TITLE&gt;上传数据文件&lt;/TITLE&gt;
&lt;META HTTP-EQUIV=&quot;CONTENT-TYPE&quot; CONTENT=&quot;TEXT/HTML;CHARSER=UTF-8&quot;&gt;
&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;css/main.css&quot;&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
function upload_file()&#123;
if( document.getElementById(&#039;FILE1&#039;).value == &#039;&#039; )&#123;
alert(&quot;请选择文件！&quot;);
return false;
&#125;

document.getElementById(&#039;uploadInfo&#039;).innerHTML = &#039;&#039; ;
document.getElementById(&#039;uploadInfo&#039;).innerHTML = &#039;&lt;img src=&quot;images/wait.gif&quot;&gt;&lt;br&gt;数据上传中，请稍候……&#039; ;

document.getElementById(&#039;form1&#039;).submit();
&#125;
&lt;/script&gt; 
&lt;/HEAD&gt;
&lt;BODY BGCOLOR=&quot;#FFFFFF&quot;&gt;
&lt;FORM METHOD=&quot;POST&quot; id=&quot;form1&quot; name=&quot;form1&quot; ENCTYPE=&quot;multipart/form-data&quot; ACTION=&quot;cgi-bin/uploadcgi.cgi&quot;&gt;
选择文件：&lt;INPUT TYPE=&quot;FILE&quot; NAME=&quot;FILE1&quot; id=&quot;FILE1&quot; class=&quot;btn&quot;&gt;&lt;INPUT TYPE=&quot;button&quot; onclick=&quot;upload_file()&quot; VALUE=&quot;上传&quot; class=&quot;btn&quot;&gt;&lt;br&gt;
&lt;center&gt;
&lt;div id=&quot;uploadInfo&quot;&gt;&lt;/div&gt;
&lt;/center&gt;
&lt;/FORM&gt;
&lt;/BODY&gt;
&lt;/HTML&gt;
</textarea><br/><br/>#############################<br/>uploadcgi.c<br/><br/><textarea name="code" class="C" rows="15" cols="100">
/**************************************************************************
2007-1-5 11:42 establish by lzh.A cgi program.
get a file from user&#039;s explorer.
***************************************************************************/
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;string.h&gt;

#define DEAL_BUF_LEN 1024
#define SIGN_CODE_LEN 100
#define FILE_NAME_LEN 64
#define FILE_SAVE_DIR &quot;/var/landog/db_upload/&quot;

enum
&#123;
STATE_START,
STATE_GET_SIGN_CODE,
STATE_GET_FILE_NAME,
STATE_GET_FILE_START,
STATE_GET_FILE_CONTENT,
STATE_CHECK_END,
STATE_END
&#125;;
/***************************************************************************
ShowErrorInfo
****************************************************************************/
static void ShowErrorInfo(char * error)
&#123;

printf(&quot;Content-Type:text/html;charset=UTF-8&#92;n&#92;n&quot;);
printf(&quot;&lt;center&gt;&lt;font color=&#039;red&#039;&gt;%s&lt;/font&gt;&lt;/center&gt;&quot; , error );
&#125;

/* 主体从这里开始 */

int main(void)
&#123;
FILE *fp; /* 文件指针，保存我们要获得的文件 */
int getState = STATE_START;
int contentLength;/*标准输入内容长度*/
int nowReadLen;
int signCodeLen;
int tmpLen;
char *nowReadP;
char *nowWriteP;
char dealBuf[DEAL_BUF_LEN];
char signCode[SIGN_CODE_LEN]; /*存储本次的特征码*/
char tmpSignCode[SIGN_CODE_LEN];
char fileName[FILE_NAME_LEN];
memset(dealBuf,0,DEAL_BUF_LEN);
memset(signCode,0,SIGN_CODE_LEN);
memset(fileName,0,FILE_NAME_LEN);
nowReadLen = 0;
if((char *)getenv(&quot;CONTENT_LENGTH&quot;)!=NULL)
&#123;
contentLength = atoi((char *)getenv(&quot;CONTENT_LENGTH&quot;));
&#125;
else
&#123;
ShowErrorInfo(&quot;没有恢复数据!&quot;);
exit(1);
&#125;

while(contentLength &gt; 0)
&#123;
if(contentLength &gt;= DEAL_BUF_LEN)
&#123;
nowReadLen = DEAL_BUF_LEN;
&#125;
else
&#123;
nowReadLen = contentLength;
&#125;
contentLength -= nowReadLen;
if(fread(dealBuf,sizeof(char),nowReadLen,stdin) != nowReadLen)
&#123;
ShowErrorInfo(&quot;读取恢复数据失败，请重试！&quot;);
exit(1);
&#125;
nowReadP = dealBuf;
while(nowReadLen &gt; 0)
&#123;
switch (getState)
&#123;
case STATE_START:
nowWriteP = signCode;
getState = STATE_GET_SIGN_CODE;
case STATE_GET_SIGN_CODE:
if(strncmp(nowReadP,&quot;&#92;r&#92;n&quot;,2) == 0)
&#123;
signCodeLen = nowWriteP - signCode;
nowReadP++;
nowReadLen--;
*nowWriteP = 0;
getState = STATE_GET_FILE_NAME;
//ShowErrorInfo(signCode);
&#125;
else
&#123;
*nowWriteP = *nowReadP;
nowWriteP++;
&#125;
break;
case STATE_GET_FILE_NAME:
if(strncmp(nowReadP,&quot;filename=&quot;,strlen(&quot;filename=&quot;)) == 0)
&#123;
nowReadP += strlen(&quot;filename=&quot;);
nowReadLen -= strlen(&quot;filename=&quot;);
nowWriteP = fileName + strlen(FILE_SAVE_DIR);
while(*nowReadP != &#039;&#92;r&#039;)
&#123;
if(*nowReadP == &#039;&#92;&#92;&#039; &#124;&#124; *nowReadP == &#039;/&#039;)
&#123;
nowWriteP = fileName + strlen(FILE_SAVE_DIR);
&#125;
else if(*nowReadP != &#039;&#92;&quot;&#039;)
&#123;
*nowWriteP = *nowReadP;
nowWriteP++;
&#125;
nowReadP++;
nowReadLen--;
&#125;
*nowWriteP = 0;
nowReadP++;
nowReadLen--;
getState = STATE_GET_FILE_START;
memcpy(fileName,FILE_SAVE_DIR,strlen(FILE_SAVE_DIR));
if((fp=fopen(fileName,&quot;w&quot;))==NULL)
&#123;
fprintf(stderr,&quot;open file error&#92;n&quot;);
exit(1);
&#125;
//ShowErrorInfo(fileName);
&#125;
break;
case STATE_GET_FILE_START:
if(strncmp(nowReadP,&quot;&#92;r&#92;n&#92;r&#92;n&quot;,4) == 0)
&#123;
nowReadP += 3;
nowReadLen -= 3;
getState = STATE_GET_FILE_CONTENT;
//ShowErrorInfo(&quot;get&quot;);
&#125;
break;
case STATE_GET_FILE_CONTENT:
if(*nowReadP != &#039;&#92;r&#039;)
&#123;
fputc(*nowReadP,fp);
&#125;
else
&#123;
if(nowReadLen &gt;= (signCodeLen + 2))
&#123;
if(strncmp(nowReadP + 2,signCode,signCodeLen) == 0)
&#123;
getState = STATE_END;
nowReadLen = 1;
ShowErrorInfo(&quot;数据上传成功&quot;);
/* if( system( &quot;/var/landog/app/sniff/db_recover.sh&quot; ) == 0 )&#123;
ShowErrorInfo( &quot;数据库恢复完成，请重新启动landog&quot; ); 
&#125;else&#123;
ShowErrorInfo( &quot;数据库恢复过程中出现错误，错误原因：恢复的文件已经损坏&quot; );
&#125;
*/
&#125;
else
&#123;
fputc(*nowReadP,fp);
&#125;
&#125;
else
&#123;
getState = STATE_CHECK_END;
nowWriteP = tmpSignCode;
*nowWriteP = *nowReadP;
nowWriteP++;
tmpLen = 1;
&#125;
&#125;
break;
case STATE_CHECK_END:
if(*nowReadP != &#039;&#92;r&#039;)
&#123;
if(tmpLen &lt; signCodeLen + 2)
&#123;
*nowWriteP = *nowReadP;
nowWriteP++;
tmpLen++;
if(tmpLen == signCodeLen + 2)
&#123;
*nowWriteP = 0;
if((tmpSignCode[1] == &#039;&#92;n&#039;)&amp;&amp;(strncmp(tmpSignCode + 2,signCode,signCodeLen) == 0))
&#123;
getState = STATE_END;
nowReadLen = 1;
ShowErrorInfo(&quot;数据上传成功&quot;);
/* if( system( &quot;/var/landog/app/sniff/db_recover.sh&quot; ) == 0 )&#123;
ShowErrorInfo( &quot;数据库恢复完成，请重新启动landog&quot; ); 
&#125;else&#123;
ShowErrorInfo( &quot;数据库恢复过程中出现错误，错误原因：恢复的文件已经损坏&quot; );
&#125;
*/
&#125;
else
&#123;
//fprintf(fp,tmpSignCode);
fwrite(tmpSignCode,sizeof(char),tmpLen,fp);
getState = STATE_GET_FILE_CONTENT;
&#125;
&#125;
&#125;
&#125;
else
&#123;
*nowWriteP = 0;
//fprintf(fp,tmpSignCode);
fwrite(tmpSignCode,sizeof(char),tmpLen,fp);
nowWriteP = tmpSignCode;
*nowWriteP = *nowReadP;
nowWriteP++;
tmpLen = 1;
&#125;
break;
case STATE_END:
nowReadLen = 1;
break;
default:break;
&#125;
nowReadLen--;
nowReadP++;
&#125;
&#125;
if(fp != NULL)
&#123;
fclose(fp);
&#125;
return 0;
&#125;
</textarea><br/><br/>=========================================================================<br/>另一个写在一个文件里的CGI文件上传方式，[备注：]C语言-cgi文件上传代码，它通过 getenv(&quot;CONTENT_LENGTH&quot;) 之后可以直接对stdin使用fread() 但是在实际应用时发现，有时候文件读不全 ，注意要使用二进制模式来读取，而不是文本模式：<br/><textarea name="code" class="C" rows="15" cols="100">
#include&nbsp;&nbsp; &lt;stdio.h&gt; 
#include&nbsp;&nbsp; &lt;stdlib.h&gt; 
#include&nbsp;&nbsp; &lt;string.h&gt; 
#include&nbsp;&nbsp; &lt;ctype.h&gt; 
#include&nbsp;&nbsp; &lt;fcntl.h&gt; 
#define&nbsp;&nbsp; ACHEAD &quot;ooooooooooooo&quot;
#define AC483PATH &quot;../htdocs/ac483/ac483_bak&quot;
void fit(char *,unsigned size);

int&nbsp;&nbsp; main(int&nbsp;&nbsp; argc,&nbsp;&nbsp; char&nbsp;&nbsp; *argv[]) 
&#123; 
&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;Content-Type:text/html&#92;n&#92;n&quot;);&nbsp;&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;&nbsp; *pMethod&nbsp;&nbsp; =&nbsp;&nbsp; getenv(&quot;REQUEST_METHOD&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;//printf(&quot;pMethod=%s&#92;n&quot;,pMethod); 
&nbsp;&nbsp;&nbsp;&nbsp;if(pMethod&nbsp;&nbsp; ==&nbsp;&nbsp; NULL&nbsp;&nbsp; &#124;&#124;&nbsp;&nbsp; *pMethod&nbsp;&nbsp; ==&nbsp;&nbsp; 0) 
&nbsp;&nbsp;&nbsp;&nbsp;&#123; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;No&nbsp;&nbsp; Any&nbsp;&nbsp; Method!&#92;n&quot;); 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;&nbsp; 0; 
&nbsp;&nbsp;&nbsp;&nbsp;&#125; 
&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;if(strcmp(pMethod,&nbsp;&nbsp; &quot;GET&quot;)&nbsp;&nbsp; ==&nbsp;&nbsp; 0) 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;&nbsp; 1; 
&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;if(strcmp(pMethod,&nbsp;&nbsp; &quot;POST&quot;)&nbsp;&nbsp; ==&nbsp;&nbsp; 0) 
&nbsp;&nbsp;&nbsp;&nbsp;&#123; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;&nbsp; *pCntLen&nbsp;&nbsp; =&nbsp;&nbsp; getenv(&quot;CONTENT_LENGTH&quot;); 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//printf(&quot;pCntLen=%s&#92;n&quot;,pCntLen);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!pCntLen) 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;Can&#039;t&nbsp;&nbsp; get&nbsp;&nbsp; Content_Length!&#92;n&quot;); 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;&nbsp; 0; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(*pCntLen&nbsp;&nbsp; ==&nbsp;&nbsp; 0) 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;Can&#039;t&nbsp;&nbsp; get&nbsp;&nbsp; Content_Length!&#92;n&quot;); 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;&nbsp; 0; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp; StrLen&nbsp;&nbsp; =&nbsp;&nbsp; atoi(pCntLen);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// printf(&quot;StrLen=%d&#92;n&quot;,StrLen); 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(StrLen&nbsp;&nbsp; &lt;=&nbsp;&nbsp; 0) 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;String&nbsp;&nbsp; Length&nbsp;&nbsp; &lt;=&nbsp;&nbsp; 0&#92;n&quot;); 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;&nbsp; 0; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//char *ph = getenv(&quot;CONTENT_TYPE&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//printf(&quot;ph=%s&#92;n&quot;,ph);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char *readstr=(char&nbsp;&nbsp; *)malloc(StrLen+1);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fread(readstr,StrLen,1,stdin);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// printf(&quot;readstr=%s&#92;n&quot;,readstr);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int n=0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int firstLineMark=0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int firstLineCount=0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int headCount=0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(n&lt;4)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(*(readstr++)==&#039;&#92;n&#039;)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;firstLineMark++;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n++;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(firstLineMark==0)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;firstLineCount++;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;headCount++;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StrLen = StrLen-headCount;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fit(readstr,13);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(strcmp(readstr,ACHEAD)!=0)
&nbsp;&nbsp;&#123;
&nbsp;&nbsp;printf(&quot;&lt;SCRIPT language=JavaScript&gt;alert(&#039;文件不正确!&#039;);javascript:history.go(-1)&lt;/SCRIPT&gt;&quot;);
&nbsp;&nbsp;
&nbsp;&nbsp;return 0;
&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FILE *fp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((fp=fopen(AC483PATH,&quot;wb&quot;))==NULL)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;error open file&#92;n&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fwrite(readstr+13,StrLen-13-firstLineCount-5,1,fp);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fclose(fp);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;&lt;SCRIPT language=JavaScript&gt;alert(&#039;恭喜升级成功!&#039;);javascript:history.go(-1)&lt;/SCRIPT&gt;&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// printf(&quot;恭喜升级成功!&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&#125; 
&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;&nbsp; 0; 
&#125;&nbsp;&nbsp; 
void fit(char *string,unsigned size)
&#123;
if(strlen(string)&gt;size)
*(string+size)=&#039;&#92;0&#039;;
&#125;
</textarea><br/>打开一个文件，上传到服务器指定的文件中．适用于一些软件在线更新．文字！<br/>CGI中文件无法上传<br/>&nbsp;&nbsp;&nbsp;&nbsp; 在调试cgictest.cgi过程中，发现文件无法上传，提示“No file was uploaded.”。<br/>&nbsp;&nbsp;&nbsp;&nbsp; 原因有两点：<br/>&nbsp;&nbsp;&nbsp;&nbsp; 1、boa的用户权限不够，无法建立临时文件。改为root用户启动<br/>&nbsp;&nbsp;&nbsp;&nbsp; 2、cgi是以GET形式发送表格的。改为POST形式。<br/><br/>更多参考：<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; http://hi.baidu.com/andforce/item/787a822953d87bc9dcf69ac3<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; http://wenku.baidu.com/view/35fc800b52ea551810a687ed.html<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; http://blog.csdn.net/xyj0663/article/details/4666146
]]>
</description>
</item><item>
<link>http://www.jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] [作为备案]用c语言写cgi程序实现文件上传]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://www.jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>