荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: 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. 不同变量或文件之间的分隔


经过多次实验和验证,不同变量、文件内容之间是以一定的分隔边界分开的。该分隔边界由
系统随机生成。在每个变量或文件内容内,实际的传输内容与分隔边界之间,存在着
contenttype等关键词,在关键词与实际内容之间,是以一个单行的回车和换行符号来分
隔的。即实际格式为:

     分隔边界

     关键词

     (此处为回车,换行符形成的一行)

     变量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软件 网络书店