文章探索:   分类:    关键字:  
  + 栏目导航
  + 相关文章
asp中有关字符编码转换的几个函数
绝妙的asp生成静态页面html函数
Asp计算页面执行时间
一个简单的用存储过程分页
将asp页面转换成htm页面
ASP网站漏洞解析及黑客入侵防范方法
URL编码与SQL注入
几种常用排序算法(asp)
ASP调用带参数存储过程的几种方式
实用的ASP连接数据库的函数
ASP如何获取真实IP地址
ASP中怎么实现SQL数据库备份、恢复
判断Cookies是否处于开启状态
怎样才能将服务器端文件夹下的文件,..
几行Asp代码实现防止表单重复提交
用ASP设计网站在线人数统计程序
asp论坛在线人数统计研究
如何用ASP远程在数据库中创建Table
用ASP调用SQL Server的视图和存储过程
Asp与XML的关系
ASP读取EXCEL
在ASP中使用Oracle数据库技巧
一个通过web.Mail发送邮件的类
几种打开记录集方式的比较
购物车范例(购物车页面 )
如何使用FSO搜索硬盘文件
GB码和BIG5码的互换技术
用ASP开发WEB日期选择器
一个投票系统的源程序(coveryourasp.c..
列出服务器上的打印机


技术教程 -> ASP教程 ->  
实例详解ASP的上传功能
来源:转载   人气:664   录入时间:2007-11-8
      这个问题已经不是什么新鲜问题了,网上也有大把的教程,但大多数是授人以鱼,而不授人以渔,经过辛苦的资料收集,思考,调试,整理,我基本上已经把这个问题从原理上搞清楚了,现在根据我自己的理解,在范例程序的基础上,加以解释,希望能对部分网友有所帮助。
   
     请诸位大虾能对其中的不正或不良这处予以指正。
   
     我想循序渐进,先讲一个简单的,单个图片文件保存到数据库。
   
     这个范例共包括三个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 "</table>"
   
    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>
   </table>
   </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
   %>
   
     上面讲了单个图片文件保存到数据库,下面讲一下文本信息与图片文件同时提交保存到数据库,图片文件也可保存到磁盘文件。
   
   MultiInputOrImageToData.asp
   <%@ Language=VBScript %>
   <% option explicit %>
   
   <%
    '把一段二进制数据写入到一个文件
    sub saveBin2File(srmSource,posB,posLen,strPath)
     dim srmObj
     set srmObj = server.CreateObject("adodb.stream")
     srmObj.Type = 1
     srmObj.Mode = 3
     srmObj.Open
      
     srmSource.Position = posB-1
     srmSource.CopyTo srmObj,posLen
     srmObj.Position = 0
     srmObj.SaveToFile strPath,2   '如果该文件已经存在,无条件覆盖
     srmObj.Close
     set srmObj = nothing
    end sub
   
    '二进制数据转换为字符串,包括汉字
    function getTextfromBin(srmSource,posBegin,posLen)
     dim srmObj, strData
     set srmObj = server.CreateObject("adodb.stream")
     srmObj.Type = 1
     srmObj.Mode = 3
     srmObj.Open
   
     srmSource.position = posBegin-1   '位置计数首数不一样,这个对象是对0开始的
     srmSource.CopyTo srmObj,posLen
     srmObj.Position = 0
     srmObj.Type = 2
     srmObj.Charset = "gb2312"
     strData = srmObj.ReadText
   
     srmObj.Close
     set srmObj = nothing
      
     getTextfromBin = strData
    end function
       
    '双字节字符串转换成单字节字符串
    function getSBfromDB(bytString)
     dim bin, i
     bin = ""
     for i=1 to len(bytString)
      bin = bin & chrb(asc(mid(bytString,i,1)))
     next
     getSBfromDB = bin
    end function
   
    '单字节字符串转换成双字节字符串
    function getDBfromSB(bitString)
     dim str, i
     str = ""
     for i=1 to lenb(bitString)
      str = str & chr(ascb(midb(bitString,i,1)))
     next
     getDBfromSB = str
    end function
    
    '从一个完整路径中析出文件名称
    function getFileNamefromPath(strPath)
     getFileNamefromPath = mid(strPath,instrrev(strPath,"\")+1)
    end function
   
    '判断函数
    function iif(cond,expr1,expr2)
     if cond then
      iif = expr1
     else
      iif = expr2
     end if
    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>导航菜单:<b>上传图片</b> <a href="ShowImageListFromData2.asp">显示图片</a><hr></p>
    
   <%
    if request.ServerVariables("REQUEST_METHOD") = "POST" then
   
     dim sCome, binData
     dim posB, posE, posSB, posSE
     dim binCrlf, binSub
     dim strTitle, strFileName, strContentType, posFileBegin, posFileLen, aryFileInfo
     dim i, j
     dim dicData
     dim strName,strValue
     
     binCrlf = getSBfromDB(vbcrlf)  '定义一个单字节的回车换行符
     binSub = getSBfromDB("--")    '定义一个单字节的“--”字符串
     
     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>"       '调试用
     
     posB = instrb(binData,binSub)
     posB = instrb(posB,binData,bincrlf) + 2   '+2是加入回车换行符本身的长度
     posB = instrb(posB,binData,getSBfromDB("name=""")) + 6
     
     set dicData = server.CreateObject("scripting.dictionary")    '用来保存信息
     
     do until posB=6
      posE = instrb(posB,binData,getSBfromDB(""""))
      'Response.Write "name=" & getTextfromBin(sCome,posB,posE-posB) & "<br>"
      strName = getTextfromBin(sCome,posB,posE-posB)
      
      posB = posE + 1     '指针移动到“"”的后面
      posE = instrb(posB,binData,bincrlf)
      'Response.Write posB & "->" & posE & "<br>"
     
      if instrb(midb(binData,posB,posE-posB),getSBfromDB("filename=""")) > 0 then   '判断成功表示这是一个file域
       posB = instrb(posB,binData,getSBfromDB("filename=""")) + 10
       posE = instrb(posB,binData,getSBfromDB(""""))
       if posE>posB then
        'response.Write "filename=" & getTextfromBin(sCome,posB,posE-posB) & "<br>"
        strFileName = getFileNamefromPath(getTextfromBin(sCome,posB,posE-posB))
        posB = instrb(posB,binData,getSBfromDb("Content-Type:")) + 14
        posE = instrb(posB,binData,bincrlf)
        'response.Write "content-type=" & getTextfromBin(sCome,posB,posE-posB) & "<br>"
        strContentType = getTextfromBin(sCome,posB,posE-posB)
   
        posB = posE + 4     '这个地方换了两行,具体参看输出的原始二进制数据
        posE = instrb(posB,binData,binSub)
        'response.Write "image data="
       
        'saveBin2File sCome,posB,posE-posB-1,server.MapPath("./") & "\test.jpg"
        'Response.Write "<img src='test.jpg' border=0><br>"
        posFileBegin = posB
        posFileLen = posE-posB-1
        strValue = strFileName & "," & strContentType & "," & posFileBegin & "," & posFileLen
       else
        'Response.Write "没有上传文件!" & "<br>"
        strValue = ""
       end if
      else
       posB = posE + 4     '这个地方换了两行,具体参看输出的原始二进制数据
       posE = instrb(posB,binData,binCrlf)
       'Response.Write "value=" & getTextfromBin(sCome,posB,posE-posB) & "<br>"  '这个后面没有“"”,所以不用-1
       strValue = getTextfromBin(sCome,posB,posE-posB)
      end if
     
      dicData.Add strName,strValue
      
      posB = posE + 2
     
      posB = instrb(posB,binData,bincrlf) + 2
      posB = instrb(posB,binData,getSBfromDB("name=""")) + 6
     loop
     
     strTitle = dicData.Item("txtTitle")
     aryFileInfo = dicData.Item("filImage")
     if aryFileInfo <> "" then         '有文件数据上传
      aryFileInfo = split(aryFileInfo,",")
      strFileName = aryFileInfo(0)
      strContentType = aryFileInfo(1)
      posFileBegin = aryFileInfo(2)
      posFileLen = aryFileInfo(3)
      
      sCome.Position = posFileBegin-1
      binData = sCome.Read(posFileLen)
           
      dim cn, rs, sql
      set cn = server.CreateObject("adodb.connection")
      cn.Open cnstr
      set rs = server.CreateObject("adodb.recordset")
      sql = "select title,[content-type],image from tblImage2"
      rs.Open sql,cn,1,3
      rs.AddNew
      rs.Fields("title").Value = strTitle
      rs.Fields("content-type").Value = strContentType
      
      '数据保存到数据库
      rs.Fields("image").AppendChunk binData
   
      '如果数据以文件形式保存到磁盘上,用下面这句
      'saveBin2File sCome,posFileBegin,posFileLen,server.MapPath("./") & strFileName
   
      rs.Update
      rs.Close
      set rs = nothing
      cn.Close
      set cn = nothing
      
      Response.Write "<p>文件保存成功!</p>"
     else
      Response.Write "<p>没有上传文件!</p>"
     end if
     
     sCome.Close
     set sCome = nothing  
    else
   %>
     <form id="frmUpload" name="frmUpload" action="<%=Request.ServerVariables("script_name")%>" method="post" target="_self" enctype="multipart/form-data">
      <p>标题:<input id="txtTitle" type="text" name="txtTitle" size="40"></p>
      <p>图片:<INPUT id="filImage" type="file" name="filImage" size="40"></p>
      <INPUT id="btnUpload" type="submit" value="Upload" name="btnUpload">
     </form>
   <%
    end if
   %>
    </body>
   </HTML>
   




Copyright(C)2007-2024 广州市佳沛数码科技有限公司 版权所有
公司地址: 广州市荔湾区东漖北路560号511室
电话:020-81803473 传真:020-81544987