让网站更具人性化──用ASP进行图片的上传与管理 宋文津 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号,所以在进入之前用户必须填写自己的用户名和密码,在此文件中也要检验用户名和密码的正确性。下面是此文件的源代码:    '此包含文件是数据库的连接语句    <% 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 %>          会员图片上传          <% If Rs.Bof OR Rs.Eof Then    Response. Write"
我们的数据库中没有查到你的用户名,请先注册新用户

"    Response.Write"注册新用户"    Response.Write"

"    Else    If trim(Request("pwd" )) <>Rs("pwd" ) Then    Response. Write"
密码出错,请检查是否大小写不对。

"    Response.Write" 返回 "    Response.Write"

"    else    %>   
                       
选择照片:
   ">
   <% end if    end if    conn.Close    set conn=nothing %>       其中,表单域“file1”可以提供对话框让用户选择需要上传的图片;另外,我们设置了一个隐含的表单域“userid”读入此用户的ID号以便upload.asp文件使用。   #1 四、upload.asp文件的编写    在upload.asp文件中我们将调用LyfUpload.dll组件来处理和接收上传的图片信息,并将图片更名后保存到photo字段中。下面是upload.asp的源代码:             会员图片上传               
   <% 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("文件尺寸过大!")    else    Response.Write "选择的文件已经上传到服务器!"    Response.Write("

文件名称:" & ss)    Response.Write("
文件格式:" & aa)    Response.Write("
文件大小:" & obj.FileSize)    end if %>   

   <% Dim SQL    SQL = "Update user " & "Set" & "photo="    SQL = SQL & "'" &path& "'"    SQL = SQL & " where userid=" & txt    Conn.Execute SQL    conn.Close    set conn=nothing %>          其中“obj.maxsiz”与“obj.extname”分别规定了上传图片的大小和类型;“ss=obj.SaveFile("file1", " c:\inetpub\wwwroot\photo",obj.request("userid" ))”的意思是将用户选择的图片更名为其ID号然后保存到主目录下的Photo目录里;最后的那一部分ASP语句是将图片的路径和文件名写入到数据库的photo字段中。   #1 五、图片的显示    在需要显示图片的.asp文件中写入这样的代码:       <% if rs("photo" ) <>"0" then%>    " width="250" height="320" border="2">    <% else    Response.Write "没有照片"    end if %>    需要说明的只有一点,就是应在代码中对图片的长宽加以规定,即以统一的尺寸来显示图片,这样才不至于破坏整体页面显示。    到此我们已经完成了图片的上传、接收和显示,实际上,不仅仅是图片,其他可以上传的文件也可做类似的处理。另外在实际应用中,我们还能够依靠组件和数据库的强大功能作更为丰富的设计。如果你对此有什么问题或要求,可以通过Swjin@21cn.com和我联系。