荔园在线
荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀
[回到开始]
[上一篇][下一篇]
发信人: icefire (懒懒的心懒懒的我), 信区: Program
标 题: [转寄] [转载] [范文]如何在Web页面上实现客户端文件上载
发信站: BBS 荔园晨风站 (Sun Nov 22 19:16:15 1998), 站内信件
【 以下文字转载自 icefire 的信箱 】
【 原文由 icefire.bbs@melon.gznet.edu.cn 所发表 】
发信人: italina (欣儿 — 忙于论文), 信区: CGI
标 题: [转载] [范文]如何在Web页面上实现客户端文件上载
发信站: 华南网木棉站 (Mon Nov 16 22:50:40 1998), 站内信件
如何在Web页面上实现客户端文件上载
北京科技大学管理学院 张瑞华 潘永泉
众所周知,WWW上链接着数目巨大、品种繁多的信息。然而,在WWW
上的多数信息都处于静止状态。文件中的信息也是站点管理人员干预或修改以后才能发生变
化。显然,这种静止状态的页面缺乏交互性,用户处于被动地位。
目前,许多WWW站点已经能够让它的用户在访问时达到主动水平。人们也能够把WWW看
作交互性媒体,从在线购物到远程机器人都体现了WWW
的交互性。也只有靠WWW服务器的交互性功能才能更多地吸引用户,提高他们的参与性。在
各种交互式输入中,有一种特殊的需求,即上载文件。
公共网关接口CGI(Common Gateway Interface)
是把浏览器与服务器程序结成一体的一种标准。它负责处理HTML文件与运行在服务器中的程
序(HTML以外的程序)之间的数据交换。当用户输入他们的信息,按下Submit
按纽,便激活了一个CGI程序。该CGI程序完成用户的查询或注册任务,并把查询结果或注册
结果传给CGI,通过CGI传给Web服务器。由此可以看出,CGI
程序在用户和服务器之间进行交互查询或注册所起的重要作用。没有CGI
程序,读者便不可能与服务器进行交互。
FORM的使用
FORM
是HTML提供的一种标识,我们可以使用FORM为用户在屏幕上建立一张窗口,让用户在此窗口
中输入信息。
在HTML中,FORM的标识是<FORM>...</FORM>,它有开始和结束标识,在开始标识中带有
两个属性:ACTION
和METHOD。
格式:<FORM METHOD=‘...' ACTION=‘...'>
ACTION属性的等号后面写明这个FORM提交后需要执行的CGI程序名(包括路径),CGI
程序驻留在服务器的某个目录中,一旦用户提交输入信息后,服务器便启动这个程序,完成
交互任务。
METHOD
属性说明发送输入信息给服务器时使用的方式,它有两种选择:POST
和GET。使用POST 时,将FORM
的输入信息进行包装。CGI程序可以用CONTENT_LENGTH环境变量去决定传送输入信息的长度
,再从标准输入(STDIN)将内容读出。
FORM中输入数据标识的使用
<INPUT>是用户输入信息时用的标识,其属性TYPE指出用户输入的值是什么类型,一
般为“TEXT”和“FILE”类型。
1. 使用TEXT类型的INPUT语句的例子:
<html><head><title>test form</title></head>
<body>
<form method=“post" action=“.../cgi-bin/filename">
请输入学校的名称:
<input type=“text" name=“test">
</form>
</body>
</html>
2.
使用file类型的input语句的例子:(下面读取CGI内容的例子都以此页面为调用CGI页面)
<html><head><title>test form</title></head>
<body>
<formentype=multipart/form-data method=“post" action=“.../cgi-
bin/filename">
请选择要上载的变量1:
<input type=“text" name=“upload0">
请选择要上载的文件1:
<input type=“file" name=“upload1">
请选择要上载的文件2:
<input type=“file" name=“upload2">
</form>
</body>
</html>
CGI的实现
CGI是一种描述,而不是一种语言,CGI最常用的语言是PERL语言和C语言。下面的例子
都使用C语言编写。
1. CGI传输数据格式
按下SUBMIT
按纽之后,CGI上传数据格式为前缀+变量内容(文件内容),前缀由用户所用的浏览器随
机生成。例如:
------------99752216210941
Content-Disposition: form-data; name=“upload0"
变量内容
--------------99752216210941
Content-Disposition: form-data; name=“upload1"; filename=“
D:\hjly\Forw_dep.gif"
Content-Type: image/gif
文件内容
---------------99752216210941
Content-Disposition: form-data; name=“upload2"; filename=“
D:\hjly\upload.txt"
Content-Type: text/plain
文件内容
2. 上传数据内容的读出
针对数据上传的格式,函数get_up_pre(fd)
首先读出CGI上载的所有内容,并取出前缀作为每个文件的分隔符号,即从stdin
读出内容,全部放在fd文件指针所指的文件中。
int up_prefix[200];/*用来存储上传内容的前缀部分*/
int up_prefix_num;/*用来存储上传内容的前缀部分的个数*/
void get_up_pre(fd)
FILE *fd;
{
int ch1,i;
for (i=0;i<200;i++)
up_prefix[i]=0;
ch1=fgetc(stdin);
i=0;
while (!(feof(stdin)))
{if (ch1==13)
break;
up_prefix[i]=ch1;
i=i+1;
fputc(ch1,fd);
ch1=fgetc(stdin);
}
up_prefix_num=i;
while (!(feof(stdin)))
{fputc(ch1,fd);
ch1=fgetc(stdin);
}
}
3. 不同变量或文件之间的分隔
经过多次实验和验证,不同变量、文件内容之间是以一定的分隔边界分开的。该分隔边界由
系统随机生成。在每个变量或文件内容内,实际的传输内容与分隔边界之间,存在着
contenttype等关键词,在关键词与实际内容之间,是以一个单行的回车和换行符号来分
隔的。即实际格式为:
分隔边界
关键词
(此处为回车,换行符形成的一行)
变量1或文件1实际内容
分隔边界
关键词
(此处为回车,换行符形成的一行)
变量2或文件2实际内容
分隔边界
…
在此,我们用函数get_content(文件指针1,文件指针2)来从文件1中读出变量或文件
的内容,然后存储在文件2中。程序代码为:
void get_content(fd1,fd2)
FILE fd1;
FILE fd2;
{ intch2[120];
intch1,i,j;
intnum;
intend_prefix;/变量或文件内容结束与否标志/
for(i=0;i<120;i++)
ch2[i]=0;
ch1=fgetc(fd1);
/*跳过上边界和关键词部分*/
while (!(feof(fd1)))
{
while(!(ch1==10))
{ ch1=fgetc(fd1);
if (ch1==10)
break;
}
ch1=fgetc(fd1);
ch1=fgetc(fd1);
if (ch1==10)
break; /如果两个回车换行相临,则结束/
}
while (!(feof(fd1)))
{
ch1=fgetc(fd1);
if (!(ch1==up_prefix[0]))/如果不是边界[0]的值,则写在文件2中/
fputc(ch1,fd2);
if (ch1==up_prefix[0])/如果出现与边界[0]一样的字符,进行判断/
{ ch2[0]=ch1;
i=1;
ch1=fgetc(fd1);
while (ch1==up_prefix[i])
{
ch2[i]=ch1;
i=i+1;
ch1=fgetc(fd1);
if (!(ch1==up_prefix[i]))
break;
}
/end while ch1==45/
num=up_prefix_num-2;
if (i>=num) /是边界/
break;
else/不是边界*/
{
for(j=0;j<=i-1;j++)
fputc(ch2[j],fd2);
fputc(ch1,fd2);
}/end if i>6/
} /end if ch1==45/
}/end while eof()/
fclose(fd2);
}
4. 主程序调用
有了以上工作,我们就可以取出我们想要的文件内容了。主程序如下:
#include<stdlib.h>
#include<time.h>
#include<string.h>
int up_prefix[200];
int up_prefix_num;
void get_content();
void get_up_pre();
main()
{
FILE fd;
FILE fd1;
$char string1;
int ch1,i,j;
$char ErrMsgGc[512];
$int sum1;
printf(“content-type:text/html%c%c",10,10);
/get cgi value into file upload1.txt***/
if ((fd = fopen(“upload1.txt", “w+" ))==NULL)
{printf( “Can't open the file!\n" );
exit( 0 );
}
get_up_pre(fd);
printf(“(%d)<br>",up_prefix_num);
/ 0-(i-1) */
fclose(fd);
if ((fd= fopen(“upload1.txt", “r" ))==NULL)
{printf( “Can't open the file!\n" );
exit( 0 );
}
/从upload1.txt得到变量upload0的值存储在upload_table.txt中
/
if ((fd1= fopen(“upload_table.txt", “w+" ))==NULL)
{printf( “Can't open the file!\n" );
exit( 0 );
}
get_content(fd,fd1);
/从upload1.txt得到文件upload1的内容存储在upload_str.txt中
/
if ((fd1= fopen(“upload_str.txt", “w+" ))==NULL)
{printf( “Can't open the file!\n" );
exit( 0 );
}
get_content(fd,fd1);
/从upload1.txt得到文件upload2的内容存储在upload_txt.txt中
/
if ((fd1=fopen(“upload_txt.txt", “w+" ))==NULL)
{printf( “Can't open the file!\n" );
exit( 0 );
}
get_content(fd,fd1);
fclose(fd);
fclose(fd1);
printf(“您成功上传了文件!");
}
结论
通过对CGI文件传输技术的讨论,我们可以从Web页面上载文件,实现了用户与服务器
之间更多方式的交互。
-- @@@@@@ @@@ @@@ @@@ @@@ 信言不美,美言不信。善者不辩,
@@@@@@@ @@! @@@ @@@ @@! @@@ @@@ @@!@!@@@ 者不善。知者不博,博者不知。圣人
!@@ @!@!@!@! @@! @!@ !@! @@! @!@@!!@! 不积,既以为人己愈有,既以与人己
!@! !!: !!! @!! !: .:! !!@ !!: !!! 愈多。天之道,利而不害;圣人之
:!! : : : !!: :: !!: :: : 道,为而不争。
:: :: : :::.:: : ICQ:5704502 Email:calvin@nease.net
※ 来源:.华南网木棉站 bbs.gznet.edu.cn.[FROM: 202.38.212.86]
--
※ 转载:.华南网木棉站 bbs.gznet.edu.cn.[FROM: 202.38.214.40]
--
※ 转寄:.华南网木棉站 bbs.gznet.edu.cn.[FROM: linux.szu.edu.cn]
--
※ 转载:.BBS 荔园晨风站 bbs.szu.edu.cn.[FROM: 192.168.0.22]
[回到开始]
[上一篇][下一篇]
荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店