[摘要]第一重:单个图片上传到数据库  这个问题已经不是什么新鲜问题了,网上也有大把的教程,但大多数是授人以鱼,而不授人以渔,经过辛苦的资料收集,思考,调试,整理,我基本上已经把这个问题从原理上搞清楚了,现...
第一重:单个图片上传到数据库
  这个问题已经不是什么新鲜问题了,网上也有大把的教程,但大多数是授人以鱼,而不授人以渔,经过辛苦的资料收集,思考,调试,整理,我基本上已经把这个问题从原理上搞清楚了,现在根据我自己的理解,在范例程序的基础上,加以解释,希望能对部分网友(比我还菜的:-))有所帮助。
  请诸位大虾能对其中的不正或不良这处予以指正。
  程序中stream对象的用法上参考了“化境HTTP上传程序 Version 2.0”在代码,在此对稻香老农和梁无惧表示衷心的感谢和由衷的敬意。
  我想循序渐进,今天先讲一个简单的,单个图片文件保存到数据库。
这个范例共包括三个ASP文件和一个数据库(一个表),全部在同一目录下。
1、tblImage 表结构(ACCESS 2000)
  sn     自动编号 序列号
  content-type 文本   图片类型
  image    OLE 对象 图片数据
2、SimpleImageToData.asp:上传表单及保存图片到数据库的代码部分,主要文件。
<%@ Language=VBScript %>
<% option explicit %>
<%
 '从一个完整路径中析出文件名称
 function getFileNamefromPath(strPath)
  getFileNamefromPath = mid(strPath,instrrev(strPath,"\")+1)
 end function
 '定义数据库连接字符串
 dim cnstr
 cnstr = "driver={Microsoft Access Driver (*.mdb)};dbq=" & server.MapPath("./upload.mdb")
%>
<HTML>
 <HEAD>
  <title>单个图像保存到数据库</title>
  <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
 </HEAD>
 <body>
<p><a href="SimpleImageToData.asp">上传图片</a>
 <a href="ShowImageListFromData.asp">显示图片</a><hr></p> 
<%
 if request.ServerVariables("REQUEST_METHOD") = "POST" then
  dim sCome, sGo, binData, strData
  dim posB, posE, posSB, posSE
  dim binCrlf
  dim strPath, strFileName, strContentType  
  binCrlf = chrb(13)&chrb(10)   '定义一个单字节的回车换行符  
  set sCome = server.CreateObject("adodb.stream")
  sCome.Type = 1  '指定返回数据类型 adTypeBinary=1,adTypeText=2
  sCome.Mode = 3  '指定打开模式 adModeRead=1,adModeWrite=2,adModeReadWrite=3
  sCome.Open 
  sCome.Write request.BinaryRead(request.TotalBytes)  
  sCome.Position = 0
  binData = sCome.Read   
  'response.BinaryWrite binData    '调试用:显示提交的所有数据
  'response.Write "<hr>"        '调试用  
  set sGo = server.CreateObject("adodb.stream")
  sGo.Type = 1
  sGo.Mode = 3
  sGo.Open   
  posB = 1
  posB = instrb(posB,binData,binCrlf)
  posE = instrb(posB+1,binData,binCrlf)
  'response.Write posB & "   " & posE & "<br>"  
  sCome.Position = posB+1
  sCome.CopyTo sGo,posE-posB-2
  sGo.Position = 0
  sGo.Type = 2
  sGo.Charset = "gb2312"
  strData = sGo.ReadText 
  sGo.Close   
  'response.Write strData & "<hr>"  
  posSB = 1
  posSB = instr(posSB,strData,"filename=""") + len("filename=""")
  posSE = instr(posSB,strData,"""")  
  if posSE > posSB then
   strPath = mid(strData,posSB,posSE-posSB)
   'response.Write "本地路径:" & strPath & "<br>"
   'response.Write "文件名:" & getFileNamefromPath(strPath) & "<br>"   
   posB = posE
   posE = instrb(posB+1,binData,binCrlf)
   'response.Write posB & "   " & posE & "<br>"   
   sGo.Type = 1
   sGo.Mode = 3
   sGo.Open 
   sCome.Position = posB
   sCome.CopyTo sGo,posE-posB-1
   sGo.Position = 0
   sGo.Type = 2
   sGo.Charset = "gb2312"
   strData = sGo.ReadText 
   sGo.Close    
   strContentType = mid(strData,16)   '此处因为固定的,所以省略查找 :-)
   'response.Write "图片类型:" & strContentType & "<hr>"   
   posB = posE+2
   posE = instrb(posB+1,binData,binCrlf)
   'response.Write posB & "   " & posE & "<br>"   
   sGo.Type = 1
   sGo.Mode = 3
   sGo.Open 
   sCome.Position = posB+1
   sCome.CopyTo sGo,posE-posB-2   
   sGo.Position = 0
   strData = sGo.Read 
   sGo.Close   
   'response.Write lenb(strData) & "<br>"       
   dim cn, rs, sql
   set cn = server.CreateObject("adodb.connection")
   cn.Open cnstr
   set rs = server.CreateObject("adodb.recordset")
   sql = "select * from tblImage"
   rs.Open sql,cn,1,3
   rs.AddNew 
   rs.Fields("content-type").Value = strContentType
   rs.Fields("image").AppendChunk strData 
   rs.Update 
   rs.Close
   set rs = nothing
   cn.Close
   set cn = nothing
   response.Write "图片保存成功!" & "<br>"
  else
   response.Write "没有上传图片!" & "<br>"
  end if  
  set sGo = nothing
  sCome.Close 
  set sCome = nothing  
 else
%>
  <form id="frmUpload" name="frmUpload" action="SimpleImageToData.asp" method="post" target="_self" enctype="multipart/form-data">
   <INPUT id="filImage" type="file" name="filImage" size="40">
   <BR>
   <INPUT id="btnUpload" type="submit" value="Upload" name="btnUpload">
  </form>
<%
 end if
%>
 </body>
</HTML>
3、ShowImageListFromData.asp
<%@ Language=VBScript %>
<% option explicit %>
<html>
<head>
  <title>显示数据库中已有图片的列表</title>
  <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body>
<p><a href="SimpleImageToData.asp">上传图片</a>
 <a href="ShowImageListFromData.asp">显示图片</a><hr></p>
<table border=0 cellpadding=2 cellspacing=2>
 <tr>
  <td valign=top>
  <%
   dim cnstr
   cnstr = "driver={Microsoft Access Driver (*.mdb)};dbq=" & server.MapPath("./upload.mdb")   
   dim cn, sql, rs
   set cn = server.CreateObject("adodb.connection")
   cn.Open cnstr
   sql = "select sn,[content-type],image from tblImage"
   set rs = cn.Execute(sql)   
   response.Write "<table border=1 cellspacing=2 cellpadding=5>"
   response.Write "<tr>"
   response.Write "<th>序列号</th><th>图片类型</th><th>图片</th>"
   response.Write "</tr>"   
   do until rs.eof 
    response.Write "<tr>"
    response.Write "<td>" & rs("sn") & "</td>"
    response.Write "<td>" & rs("content-type") & "</td>"
    response.Write "<td><a href='ShowImageListFromData.asp?sn=" & rs("sn") & "'>看图</a></td>"
    response.Write "</tr>"
    rs.movenext
   loop   
   response.Write ""   
   cn.Close
   set cn = nothing
  %>
  </td>
  <td valign=top>
  <% 
   dim sn
   sn = request.QueryString("sn")
   if sn = "" then
    response.Write "没有指定图片!"
   else
    response.Write "<img border=1 src=ShowImageFromData.asp?sn=" & sn & ">"
   end if
  %>
  </td>
 </tr>
</body>
</html>
4、ShowImageFromData.asp
<%@ Language=VBScript %>
<% option explicit %>
<%
 dim sn
 sn = request.QueryString("sn")
 if sn = "" then response.End  
 dim cnstr
 cnstr = "driver={Microsoft Access Driver (*.mdb)};dbq=" & server.MapPath("./upload.mdb") 
 dim cn, sql, rs
 set cn = server.CreateObject("adodb.connection")
 cn.Open cnstr
 sql = "select sn,[content-type],image from tblImage where sn=" & cint(sn)
 set rs = cn.Execute(sql) 
 response.ContentType = rs("content-type")
 response.BinaryWrite rs("image") 
 set rs = nothing
 cn.Close
 set cn = nothing
%>
待续...  
关键词:ASP文件上传神功 首重(单个图片上传到数据库)