﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-Java JavaScript Web2.0-随笔分类-CGIC</title><link>http://www.blogjava.net/tmpbuf/category/25421.html</link><description>WWW World, Jack's World</description><language>zh-cn</language><lastBuildDate>Thu, 25 Oct 2007 16:36:19 GMT</lastBuildDate><pubDate>Thu, 25 Oct 2007 16:36:19 GMT</pubDate><ttl>60</ttl><item><title>搞了个CGIC的系列“教程”</title><link>http://www.blogjava.net/tmpbuf/archive/2007/10/25/155872.html</link><dc:creator>Jack L</dc:creator><author>Jack L</author><pubDate>Thu, 25 Oct 2007 07:00:00 GMT</pubDate><guid>http://www.blogjava.net/tmpbuf/archive/2007/10/25/155872.html</guid><wfw:comment>http://www.blogjava.net/tmpbuf/comments/155872.html</wfw:comment><comments>http://www.blogjava.net/tmpbuf/archive/2007/10/25/155872.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tmpbuf/comments/commentRss/155872.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tmpbuf/services/trackbacks/155872.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 发布在这里：<a href="http://webdn.trueself.cn/archives/107">http://webdn.trueself.cn/archives/107</a>&nbsp;&nbsp;<a href='http://www.blogjava.net/tmpbuf/archive/2007/10/25/155872.html'>阅读全文</a><img src ="http://www.blogjava.net/tmpbuf/aggbug/155872.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tmpbuf/" target="_blank">Jack L</a> 2007-10-25 15:00 <a href="http://www.blogjava.net/tmpbuf/archive/2007/10/25/155872.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用CGIC实现Web文件上传的服务端代码</title><link>http://www.blogjava.net/tmpbuf/archive/2007/08/30/141501.html</link><dc:creator>Jack L</dc:creator><author>Jack L</author><pubDate>Thu, 30 Aug 2007 12:39:00 GMT</pubDate><guid>http://www.blogjava.net/tmpbuf/archive/2007/08/30/141501.html</guid><wfw:comment>http://www.blogjava.net/tmpbuf/comments/141501.html</wfw:comment><comments>http://www.blogjava.net/tmpbuf/archive/2007/08/30/141501.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/tmpbuf/comments/commentRss/141501.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tmpbuf/services/trackbacks/141501.html</trackback:ping><description><![CDATA[<div style="text-align: left;"><br />
<br />
<br />
<br />
<br />
&nbsp; &nbsp;&nbsp;&nbsp; 本文整理发布于：<font color="#002c99"><a href="http://webdn.trueself.cn/archives/9" target="_self">http://webdn.trueself.cn/archives/9</a> <br />
<br />
<br />
<br />
<br />
<br />
</font></div>
<div>&nbsp; &nbsp;&nbsp; &nbsp;用C语言编写cgi程序的话，CGIC是非常流行的库，官方页面及下载地址为：<a target="_blank" href="http://www.boutell.com/cgic/#obtain">www.boutell.com/cgic/#obtain</a><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不少网站都有文件上传的功能，本文展示如何用CGIC库编写文件上传的服务端程序，最后给出一段简单的HTML代码，供大家测试使用。<br />
<div style="padding: 4px 5px 4px 4px; border-left-color: #cccccc; background-color: #eeeeee; font-size: 13px; width: 98%;"><span style="color: #008000;">//upload.c</span><br />
<span style="color: #000000;">#include</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">stdio.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
#include</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
#include</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">unistd.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
#include</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">fcntl.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
#include</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">sys</span><span style="color: #000000;">/</span><span style="color: #000000;">stat.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
#include</span><span style="color: #000000;">"</span><span style="color: #000000;">cgic.h</span><span style="color: #000000;">"</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;BufferLen&nbsp;1024</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;cgiMain(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">){<br />
&nbsp;&nbsp;&nbsp;&nbsp;cgiFilePtr&nbsp;file;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;targetFile;<br />
&nbsp;&nbsp;&nbsp;&nbsp;mode_t&nbsp;&nbsp;&nbsp;&nbsp;mode;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;name[</span><span style="color: #000000;">128</span><span style="color: #000000;">];<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;fileNameOnServer[</span><span style="color: #000000;">64</span><span style="color: #000000;">];<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;contentType[</span><span style="color: #000000;">1024</span><span style="color: #000000;">];<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;buffer[BufferLen];<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">tmpStr</span><span style="color: #000000;">=</span><span style="color: #000000;">NULL;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;size;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;got,t;<br />
&nbsp;&nbsp;&nbsp;&nbsp;cgiHeaderContentType(</span><span style="color: #000000;">"</span><span style="color: #000000;">text/html</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">取得html页面中file元素的值，应该是文件在客户机上的路径名</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(cgiFormFileName(</span><span style="color: #000000;">"</span><span style="color: #000000;">file</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;name,&nbsp;</span><span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(name))&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">cgiFormSuccess)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr,</span><span style="color: #000000;">"</span><span style="color: #000000;">could&nbsp;not&nbsp;retrieve&nbsp;filename\n</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">goto</span><span style="color: #000000;">&nbsp;FAIL;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;cgiFormFileSize(</span><span style="color: #000000;">"</span><span style="color: #000000;">file</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">size);<br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp; </span><span style="color: #008000;">//</span><span style="color: #008000;">取得文件类型，不过本例中并未使用</span><br />
<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;cgiFormFileContentType(</span><span style="color: #000000;">"</span><span style="color: #000000;">file</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;contentType,&nbsp;</span><span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(contentType));<br />
&nbsp;&nbsp;&nbsp; </span><span style="color: #008000;">//</span><span style="color: #008000;">目前文件存在于系统临时文件夹中，通常为/tmp，通过该命令打开临时文件。临时文件的名字与用户文件的名字不同，所以不能通过路径/tmp/userfilename的方式获得文件</span><br />
<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(cgiFormFileOpen(</span><span style="color: #000000;">"</span><span style="color: #000000;">file</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">file)&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;cgiFormSuccess)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr,</span><span style="color: #000000;">"</span><span style="color: #000000;">could&nbsp;not&nbsp;open&nbsp;the&nbsp;file\n</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">goto</span><span style="color: #000000;">&nbsp;FAIL;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;t</span><span style="color: #000000;">=-</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">从路径名解析出用户文件名</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">(</span><span style="color: #000000;">1</span><span style="color: #000000;">){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmpStr</span><span style="color: #000000;">=</span><span style="color: #000000;">strstr(name</span><span style="color: #000000;">+</span><span style="color: #000000;">t</span><span style="color: #000000;">+</span><span style="color: #000000;">1</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;">\\</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(NULL</span><span style="color: #000000;">==</span><span style="color: #000000;">tmpStr)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmpStr</span><span style="color: #000000;">=</span><span style="color: #000000;">strstr(name</span><span style="color: #000000;">+</span><span style="color: #000000;">t</span><span style="color: #000000;">+</span><span style="color: #000000;">1</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;">/</span><span style="color: #000000;">"</span><span style="color: #000000;">);</span><span style="color: #008000;">//</span><span style="color: #008000;">if&nbsp;"\\"&nbsp;is&nbsp;not&nbsp;path&nbsp;separator,&nbsp;try&nbsp;"/"</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(NULL</span><span style="color: #000000;">!=</span><span style="color: #000000;">tmpStr)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t</span><span style="color: #000000;">=</span><span style="color: #000000;">(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">)(tmpStr</span><span style="color: #000000;">-</span><span style="color: #000000;">name);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;strcpy(fileNameOnServer,name</span><span style="color: #000000;">+</span><span style="color: #000000;">t</span><span style="color: #000000;">+</span><span style="color: #000000;">1</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;mode</span><span style="color: #000000;">=</span><span style="color: #000000;">S_IRWXU</span><span style="color: #000000;">|</span><span style="color: #000000;">S_IRGRP</span><span style="color: #000000;">|</span><span style="color: #000000;">S_IROTH;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">在当前目录下建立新的文件，第一个参数实际上是路径名，此处的含义是在cgi程序所在的目录（当前目录））建立新文件&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;targetFile</span><span style="color: #000000;">=</span><span style="color: #000000;">open(fileNameOnServer,O_RDWR</span><span style="color: #000000;">|</span><span style="color: #000000;">O_CREAT</span><span style="color: #000000;">|</span><span style="color: #000000;">O_TRUNC</span><span style="color: #000000;">|</span><span style="color: #000000;">O_APPEND,mode);<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(targetFile</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">0</span><span style="color: #000000;">){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr,</span><span style="color: #000000;">"</span><span style="color: #000000;">could&nbsp;not&nbsp;create&nbsp;the&nbsp;new&nbsp;file,%s\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,fileNameOnServer);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">goto</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;FAIL;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp; </span><span style="color: #008000;">//</span><span style="color: #008000;">从系统临时文件中读出文件内容，并放到刚创建的目标文件中</span><br />
<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(cgiFormFileRead(file,&nbsp;buffer,&nbsp;BufferLen,&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">got)&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">cgiFormSuccess){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(got</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">0</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;write(targetFile,buffer,got);&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;cgiFormFileClose(file);<br />
&nbsp;&nbsp;&nbsp;&nbsp;close(targetFile);<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">goto</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;END;<br />
FAIL:<br />
&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr,</span><span style="color: #000000;">"</span><span style="color: #000000;">Failed&nbsp;to&nbsp;upload</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br />
END:&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">File&nbsp;\</span><span style="color: #000000;">"</span><span style="color: #000000;">%</span><span style="color: #000000;">s\</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;has&nbsp;been&nbsp;uploaded</span><span style="color: #000000;">"</span><span style="color: #000000;">,fileNameOnServer);<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br />
}<br />
</span></div>
<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 假设该文件存储为upload.c，则使用如下命令编辑：<br />
<div style="padding: 4px 5px 4px 4px; border-left-color: #cccccc; background-color: #eeeeee; font-size: 13px; width: 98%;"><span style="color: #000000;">gcc&nbsp;-Wall&nbsp;upload.c&nbsp;cgic.c&nbsp;-o&nbsp;upload.cgi</span></div>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 编译完成后把upload.cgi复制到你部署cgi程序的目录（通常命名为cgi-bin）。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 正式部署时，请务必修改用open创建新文件那一行代码。把open的第一个参数设置为目标文件在服务器上存储的绝对路径，或者相对于cgi程序的相对路径。本例中，出于简单考虑，在cgi程序所在目录下创建新文件。<br />
<br />
<br />
</span>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 测试用HTML代码: upload.html<br />
<div style="padding: 4px 5px 4px 4px; border-left-color: #cccccc; background-color: #eeeeee; font-size: 13px; width: 98%;"><span style="color: #0000ff;">&lt;!</span><span style="color: #ff00ff;">DOCTYPE&nbsp;html&nbsp;PUBLIC&nbsp;"-//W3C//DTD&nbsp;HTML&nbsp;4.01//EN"<br />
&nbsp;&nbsp;&nbsp;"http://www.w3.org/TR/html4/strict.dtd"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">html</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">head</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">meta&nbsp;</span><span style="color: #ff0000;">http-equiv</span><span style="color: #0000ff;">="Content-Type"</span><span style="color: #ff0000;">&nbsp;content</span><span style="color: #0000ff;">="text/html;&nbsp;charset=utf-8"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">title</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">Test&nbsp;Upload</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">title</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">meta&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="author"</span><span style="color: #ff0000;">&nbsp;content</span><span style="color: #0000ff;">="Jack"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">&nbsp;Date:&nbsp;2007-08-30&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">head</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">body</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">form&nbsp;</span><span style="color: #ff0000;">action</span><span style="color: #0000ff;">="cgi-bin/upload.cgi"</span><span style="color: #ff0000;">&nbsp;method</span><span style="color: #0000ff;">="post"</span><span style="color: #ff0000;">&nbsp;enctype</span><span style="color: #0000ff;">="multipart/form-data"</span><span style="color: #ff0000;">&nbsp;target</span><span style="color: #0000ff;">="_blank"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">input&nbsp;</span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="file"</span><span style="color: #ff0000;">&nbsp;name</span><span style="color: #0000ff;">="file"</span><span style="color: #ff0000;">&nbsp;value</span><span style="color: #0000ff;">=""</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">input&nbsp;</span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="submit"</span><span style="color: #ff0000;">&nbsp;name</span><span style="color: #0000ff;">="submit"</span><span style="color: #ff0000;">&nbsp;value</span><span style="color: #0000ff;">="OK"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">form</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">body</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">html</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span></div>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 最后的文件目录结构为<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /MyWebRoot<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---/upload.html<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---/cgi-bin<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |------/upload.cgi<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当然，你必须配置能够cgi-bin，并且程序要有权限在cgi-bin目录下创建文件（因为此例把文件上传到cgi-bin目录下）。<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 那么如何控制上传文件的大小呢？因为你有时会不允许用户上传太大的文件。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 通过分析cgic.c的源代码，我们发现它定义了一个变量cgiContentLength，表示请求的长度。但我们需要首先判断这是一个上传文件的请求，然后才能根据cgiContentLength来检查用户是否要上传一个太大的文件。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cgic.c的main函数中进行了一系列if-else判断来检查请求的类型，首先确定这是一个post请求，然后确定数据的编码方式为 "multipart/form-data"，这个判断通过之后，就要开始准备接收数据了。所以我们要在接收数据开始之前使用 cgiContentLength判断大小，如果超过标准，就立即返回，不允许继续操作。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下面贴出修改后代码片段（直接修改cgic.c的源代码即可）：<br />
<div style="padding: 4px 5px 4px 4px; border-left-color: #cccccc; background-color: #eeeeee; font-size: 13px; width: 98%;"><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(cgiStrEqNc(cgiContentType,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">multipart/form-data</span><span style="color: #000000;">"</span><span style="color: #000000;">))&nbsp;{<br />
#ifdef&nbsp;CGICDEBUG<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CGICDEBUGSTART<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(dout,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Calling&nbsp;PostMultipartInput\n</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CGICDEBUGEND&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #0000ff;">#endif</span><span style="color: #000000;">&nbsp;/*&nbsp;CGICDEBUG&nbsp;*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">我的代码<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">UpSize:文件长度上限值，以byte为单位，UpSize是一个int变量，因为cgiContentLength的类型为int</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(cgiContentLength</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">UpSize){&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cgiHeaderContentType(</span><span style="color: #000000;">"</span><span style="color: #000000;">text/html</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("File too large!\n");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cgiFreeResources();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">我的代码结束</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(cgiParsePostMultipartInput()&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;cgiParseSuccess)&nbsp;{<br />
#ifdef&nbsp;CGICDEBUG<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CGICDEBUGSTART<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(dout,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">PostMultipartInput&nbsp;failed\n</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CGICDEBUGEND&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #0000ff;">#endif</span><span style="color: #000000;">&nbsp;/*&nbsp;CGICDEBUG&nbsp;*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cgiFreeResources();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />
#ifdef&nbsp;CGICDEBUG<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CGICDEBUGSTART<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(dout,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">PostMultipartInput&nbsp;succeeded\n</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CGICDEBUGEND&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #0000ff;">#endif</span><span style="color: #000000;">&nbsp;/*&nbsp;CGICDEBUG&nbsp;*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 变量UpSize表示文件大小的上限。在cgic.c的main中找到相关代码，并修改成上面这样即可。你可以在cgic.c中定义UpSize，也可以在刚才完成的upload.c中定义，然后在cgic.c中用extern方式引用。<br />
</div>
<img src ="http://www.blogjava.net/tmpbuf/aggbug/141501.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tmpbuf/" target="_blank">Jack L</a> 2007-08-30 20:39 <a href="http://www.blogjava.net/tmpbuf/archive/2007/08/30/141501.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>