让网站更具人性化──用ASP进行图片的上传与管理

Author: 宋文津 Date: 2001年 10期

    网站上有一些主要内容来自于网络用户,比如求职招聘、婚介交友、虚拟社区等,它们都希望用户能够将相关图片上传到服务器上,并且可以动态地显示。这种功能将使网站内容更加丰富也更富于人性化。而关于图片的上传与管理也一直是ASP(Active Server Pages)中的热点问题之一。许多文章和书籍对此都有过专门的介绍和讨论,给出了各种各样的解决办法,归结起来也不外乎两种:纯代码方式和组件方式。虽然纯代码方式看起来简单易行,但是一般来说这种方法是将图片直接存储到数据库的相关字段中,这样将对数据库乃至服务器都带来极大的负担,而且对于上传图片的管理也很不方便。因此这种方法并不适合于大型的应用;与之相比,组件方式虽然需要做取得和注册组件等额外的工作,但是却能够对上传的图片进行更丰富、更强大的处理,而且ASP对于AxtiveX组件也有着良好的支持,所以使用组件可以使我们获得更高的工作效率。下面我们就以一个免费组件为例来简单地介绍一下ASP中的图片上传与管理。
  #1    一、关于组件
      这里首先介绍一下我们使用的这个免费组件:LyfUpload.dll。它来自“VB爱好者”网站(http://vbfans.yeah.net)。这个组件可以限制上传文件的大小和类型;支持多文件上传与文件的更名保存;在WIN98+PWS、NT+IIS3.0/4.0或者WIN2000+IIS5.0下都可以很好地工作,最重要的是可以免费使用。将下载的ZIP文件解压后,使用“regsvr32 lyfupload.dll”语句注册组件后,便可以在ASP中使用常规的方法使用了。另外,文件包中有详细的说明文档和相关例程。
  #1    二、设置数据库
      真正的ASP站点一定会有后台数据库的支持,同样,我们也要把用户提交图片的相关信息保存到数据库中。上文已经提到,不能将图片支持存储到数据表中。解决的办法是设置一个“photo”字段,它的数据类型是普通的文本型,将字段的缺省值设为0,在此字段中只保存图片的路径和文件名,即在每一条记录里。如果用户没有上传图片则photo字段为0;如果已经上传图片,则显示路径和文件名。另外,如果将所有上传图片都保存到同一个目录下,则有可能发生重名现象,从而引发不能正确显示的错误。解决的办法是设置一个“userid”字段,其数据类型是自动编号,此字段将自动为每一个注册用户分配一个唯一的ID号作为用户标识。在真正接收图片之前利用组件将图片的文件名更改为userid字段中的ID号,然后再进行保存。这便可以保证用户与其上传的图片能够正确的关联。
  #1    三、用户上传界面的编写
      为了接受用户的上传,我们需要编写两个ASP文件。一个是处理登录信息及给用户提供上传界面的文件,一个是处理和接收上传信息的文件。我们先介绍一下用户上传界面的文件,首先需要说明的是能够进入这个文件的用户应该是已经注册过的,否则此用户便没有ID号,所以在进入之前用户必须填写自己的用户名和密码,在此文件中也要检验用户名和密码的正确性。下面是此文件的源代码:
      <!--#include file="dbconn.asp"-->   '此包含文件是数据库的连接语句
      <% sql="select *from user where username='" & Request("user_name")& "'"
      set Rs=conn.Execute(sql)
      if Request("user_name") ="" or Request("pwd") ="" then
      Response.Redirect"memberin.htm"
      end if  %>
      <html>
      <head>
      <title>会员图片上传</title>
      </head>
      <body>
      <% If Rs.Bof OR Rs.Eof Then
      Response. Write"<html><body><center>我们的数据库中没有查到你的用户名,请先注册新用户<p>"
      Response.Write"<a href='login.htm'>注册新用户</a>"
      Response.Write"</center></body></html>"
      Else
      If trim(Request("pwd" )) <>Rs("pwd" ) Then
      Response. Write"<html><body><center>密码出错,请检查是否大小写不对。<p>"
      Response.Write"<a href='memberin.htm'> 返回 </a>"
      Response.Write"</center></body></html>"
      else
      %>
      <form name="frmUpload" Method="Post" Enctype="multipart/form-data" Action="upload.asp" >
      <table>
      <tr>
      <td >选择照片:</td>
      <td ><input type="file" name="file1" size=20 class="td"></td>
      <td ><INPUT TYPE="Submit" VALUE="上传"></ td></tr>
      <tr>
      <td  colspan="3">
      <input type="hidden" name="userid" value="<%=rs("userid") %>"></td>
      </tr></table></form>
      <% end if
      end if
      conn.Close
      set conn=nothing %>
      </body></html>
      其中,表单域“file1”可以提供对话框让用户选择需要上传的图片;另外,我们设置了一个隐含的表单域“userid”读入此用户的ID号以便upload.asp文件使用。
  #1    四、upload.asp文件的编写
      在upload.asp文件中我们将调用LyfUpload.dll组件来处理和接收上传的图片信息,并将图片更名后保存到photo字段中。下面是upload.asp的源代码:
      <!--#include file="dbconn.asp"-->
      <html>
      <head>
      <title>会员图片上传</title>
      </head>
      <body>
      <table>
      <tr>
      <td>
      <% Set obj = Server.CreateObject("LyfUpload.UploadFile")
      obj.maxsize=50000
      obj.extname="gif, jpg "
      txt = obj.request("userid")
      ss=obj.SaveFile("file1", "c:\inetpub\wwwroot\photo",obj.request("userid"))
      aa=obj.filetype?煟?"file1")
      path="photo/" & txt
      if ss= "" then
      Response.Write ("请选择相应的文件!")
      elseif ss= "0"  then
      Response.Write("<font size=4>文件尺寸过大!</font>")
      else
      Response.Write "<font size=4>选择的文件已经上传到服务器!</font>"
      Response.Write("<p>文件名称:" & ss)
      Response.Write("<br>文件格式:" & aa)
      Response.Write("<br>文件大小:" & obj.FileSize)
      end if  %>
      </td></tr></table>
      <%  Dim SQL
      SQL = "Update user " & "Set" & "photo="
      SQL = SQL & "'" &path& "'"
      SQL = SQL & " where userid=" & txt
      Conn.Execute SQL
      conn.Close
      set conn=nothing %>
      </body>
      </html>
      其中“obj.maxsiz”与“obj.extname”分别规定了上传图片的大小和类型;“ss=obj.SaveFile("file1", " c:?焅inetpub\wwwroot\photo",obj.request("userid" ))”的意思是将用户选择的图片更名为其ID号然后保存到主目录下的Photo目录里;最后的那一部分ASP语句是将图片的路径和文件名写入到数据库的photo字段中。
  #1    五、图片的显示
      在需要显示图片的.asp文件中写入这样的代码:
      <!--#include file="dbconn.asp"-->
      <% if rs("photo" ) <>"0" then%>
      <img src="photo/<%=rs("photo" )%>" width="250" height="320" border="2">
      <% else
      Response.Write "没有照片"
      end if %>
      需要说明的只有一点,就是应在代码中对图片的长宽加以规定,即以统一的尺寸来显示图片,这样才不至于破坏整体页面显示。
      到此我们已经完成了图片的上传、接收和显示,实际上,不仅仅是图片,其他可以上传的文件也可做类似的处理。另外在实际应用中,我们还能够依靠组件和数据库的强大功能作更为丰富的设计。如果你对此有什么问题或要求,可以通过Swjin@21cn.com和我联系。??