手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>网络编程>Asp.Net编程>列表

用VB编写标准CGI程序(下)

来源:互联网 作者:西部数码 时间:2008-04-09
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!

 三、CGI编程实例

  本节将用VB编写一个处理主页客户留言簿的CGI程序。除了要调用本文前面所介绍的Win32API函数外,程序中还调用了Win32API函数GetTempFileName()来获得一个唯一的临时文件名。程序中的函数UrlDecode()用来对客户端的输入进行URL译码。函数GetCgiValue()则用来分解字符串,根据表单元素的NAME属性获取其VALUE值,并调用UrlDecode()函数对其进行URL译码。

  本程序要求在留言簿文件guests.html中使用一个定位串“$#@60;! ENDHEAD $#@62;”,将文件的开始部分和具体的客户留言部分分开。CGI程序将在“$#@60;! ENDHEAD $#@62;”所在的位置插入客户新的留言。guests.html应具有如下所示的样式:

  $#@60;html$#@62;

  $#@60;head$#@62;$#@60;title$#@62;DHTML Zone $#@60;/title$#@62;$#@60;/head$#@62;

  $#@60;body bgcolor="#FFFFFF" text="#00000" vlink="#990000" link="#333399"$#@62;

  $#@60;! ENDHEAD $#@62;

  $#@60;!---客户的留言部分从这开始--$#@62;

  $#@60;P$#@62;……………………….

  $#@60;!---客户的留言部分结束于此--$#@62;

  $#@60;/body$#@62;$#@60;/html$#@62;

  这种样式将保证最后的留言出现在留言簿的最前面。如果要想使最后的留言出现在留言簿的最后面,则只需将留言簿文件中的定位字符串“$#@60;! ENDHEAD $#@62;”移到留言簿文件中客户留言部分和HTML文件结尾部分之间的位置就行了。整个程序的完整代码如下所示:

  guestbook.bas

  Declare Function GetStdHandle Lib "kernel32" (ByVal nStdHandle As Long) As Long

  Declare Function ReadFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any,ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, lpOverlapped As Any) As Long

  Declare Function WriteFile Lib "kernel32" (ByVal hFile As Long,ByVal lpBuffer As String, ByVal nNumberOfBytesToWrite As Long,lpNumberOfBytesWritten As Long, lpOverlapped As Any) As Long

  Declare Function GetTempFileName Lib "kernel32" Alias "GetTempFileNameA"(ByVal lpszPath As String, ByVal lpPrefixString As String, ByVal wUnique As Long, ByVal lpTempFileName As String) As Long

  Public Const ST NPUT_HANDLE = -10&

  Public Const STD_OUTPUT_HANDLE = -11&

  Public Const FILE_BEGIN = 0&

  Public hStdIn As Long 标准输入文件句柄

  Public hStdOut As Long 标准输出文件句柄

  Public sFormData As String 用于存储没有经过URL译码的用户输入数据

  Public lContentLength As Long

  Public CGI_RequestMethod As String

  

  Sub Main()

  Dim CGI_ContentLength As String, CGI_QueryString As String, sBuff As String, chinesetail As String

  Dim lBytesRead As Long, rc As Long,I As Long

  Dim sEmail As String, sName As String, sURL As String, sfrom As String, tempstring As String

  Dim sComment As String, tempFileName As String, guestbook As String

  CGI程序的初始化工作

  hStdIn = GetStdHandle(STD_INPUT_HANDLE)

  hStdOut = GetStdHandle(STD_OUTPUT_HANDLE)

  CGI_RequestMethod = Environ("REQUEST_METHOD")

  CGI_QueryString = Environ("QUERY_STRING")

  CGI_ContentLength = Environ("CONTENT_LENGTH")

  lContentLength = Val(CGI_ContentLength)

  sBuff = String(lContentLength, Chr$(0))

  OutPut "Content-type: text/html" & vbCrLf 输出MIME类型

  OutPut "$#@60;FONT SIZE="" 2""$#@62;"

  If CGI_RequestMethod = "POST" Then

   sBuff = String(lContentLength, Chr$(0))

   rc = ReadFile(hStdIn, ByVal sBuff, lContentLength, lBytesRead, ByVal 0&)

   sFormData = Left$(sBuff, lBytesRead)

  ElseIf CGI_RequestMethod = "GET" Then

   sFormData = CGI_QueryString

  Else

   OutPut "Unknow Form Method !"

  End If

  chinesetail = String(400, " ")

   为了在页面上正确显示中文,生成一个空格串以获取客户端用户的输入

  sName = GetCgiValue("name")

  sEmail = GetCgiValue("email")

  sURL = GetCgiValue("URL")

  sfrom = GetCgiValue("from")

  sComment = GetCgiValue("URL_Comment")

  对客户端用户的输入进行检查

  If Len(sName) = 0 Then

   OutPut "$#@60;P$#@62;非常抱歉!您还没有填写姓名!" & chinesetail

   Exit Sub

  End If

  If Len(sComment) = 0 Then

   OutPut "$#@60;P$#@62;非常抱歉!您还没有提出建议!" & chinesetail

   Exit Sub

  End If

  获取唯一的临时文件名和留言簿文件并打开它们

  tempFileName = TempFile("c:\windows\temp", "gbk")

  guestbook = "e:\netscape\server\docs\guests.html"

  Open tempFileName For Output As #1

  Open guestbook For Input As #2

  Do 本循环体用于将留言簿中字符串"$#@60;! ENDHEAD $#@62;"前面的内容写入临时文件

  Line Input #2, tempstring

  Print #1, tempstring

  Loop While tempstring $#@60;$#@62; "$#@60;! ENDHEAD $#@62;" And Not EOF(2)

  向临时文件中插入客户端用户的留言

  Print #1, "$#@60;hr$#@62;" & vbCrLf

  Print #1, "$#@60;ul$#@62;" & vbCrLf

  Print #1, "$#@60;li$#@62;$#@60;b$#@62;留言时间$#@60;/b$#@62;:" & Date$ & " " & Time$ & vbCrLf

  Print #1, "$#@60;li$#@62;$#@60;b$#@62;姓名: $#@60;/b$#@62;" & sName & vbCrLf

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!