欢迎光临
我们一直在努力

ASP文件上传神功 第三重:集成类、多语种通用,使用方便-ASP教程,ASP应用

建站超值云服务器,限时71元/月

  这个问题已经不是什么新鲜问题了,网上也有大把的教程,但大多数是授人以鱼,而不授人以渔,经过辛苦的资料收集,思考,调试,整理,我基本上已经把这个问题从原理上搞清楚了,现在根据我自己的理解,在范例程序的基础上,加以解释,希望能对部分网友(比我还菜的:-))有所帮助。

  请诸位大虾能对其中的不正或不良这处予以指正。

  程序中stream对象的用法上参考了“化境http上传程序 version 2.0”在代码,在此对稻香老农和梁无惧表示衷心的感谢和由衷的敬意。

  先来分析一下,为后面的数据分析算法打点基础,以下是我摘录的一小段网页中提交的二进制数据:

—————————–7d31ec15102d0

content-disposition: form-data; name="txttitle"

满脑的想法

—————————–7d31ec15102d0

content-disposition: form-data; name="filimage"; filename="f:\material\木纹背景\pic016.jpg"

content-type: image/pjpeg

 jfif    c 



!!e..eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee?€"   

?  } !1aqa"q2亼?#b绷r佯$3br?

侼s歊j佦=ǜ珻,%??xm 銓鼽?幮??驲湕胄滙c?

儗 g?咶? ts?b矠:u隠c

g不t凄l琰h`啨0p

g殲41?9$筵奆]眬?膁?摍? 渦"?

—————————–7d31ec15102d0

content-disposition: form-data; name="btnupload"

upload

—————————–7d31ec15102d0–

  蓝色的字符的内容我们应该熟悉吧,中间的乱码就是上传的文件的内容,其实我们要做的就是将这一堆数据进行分析,挑出对我们有用的数据保存下来就ok了。分析数据就是查找一些标志性的内容,如回车换行符,“———-”符号,用两个指针确定两个位置,然后提取数据,我的算法不知道好不好,本人的数据结构是学得很烂的,十分sorry。

以下是一个完事的应用,其中的类定义可以与入另一个文件,使用的时候只要用

 <!–include file="ljupload.cls"–>

命令包含进来就可以了。

ljupload.asp:

<%@ language=vbscript %>

<% option explicit %>

<script language=vbscript runat=server>

 private srmrequestdata   adodb.stream对象,保存从form中提交来的所有数据

 private adtypebinary   adodb.stream对象的叁数:返回二进制数据

 private adtypetext   adodb.stream对象的叁数:返回文本数据

 private admoderead   adodb.stream对象的叁数:对象可读

 private admodewrite   adodb.stream对象的叁数:对象可写

 private admodereadwrite   adodb.stream对象的叁数:对象可读写

 class ljupload   定义一个类,名称为ljupload。

  

  private bytcrlf   单字节的回车换行符,共2字节

  private bytsub   单字节的“-”符号,共8字节

  private bindata    二进制数据变量,保存一个提交数据的复本,便於操作

  private dicform   保存form文本域的信息

  private dicfile   保存form文件域的信息

  private strname   form表单的输入域名称

  private strvalue   form表单的输入域值

  private objfile   文件信息对象,保存文件相关的信息,具体叁看class ljfile的定义

  private posb   二进制数据读写指针,开始指针

  private pose   二进制数据读写指针,结束指针

  public charset   语言属性设置

  

  private sub class_initialize   类初始化过程

   

   bytcrlf = getsbfromdb(vbcrlf)

   bytsub = getsbfromdb("——–")

   charset = "gb2312"   默认语言属性设置为简体中文:gb2312

   

   adtypebinary = 1   返回二进制数据

   adtypetext = 2   返回文本数据

   admoderead = 1   对象数据可读

   admodewrite = 2   对象数据可写

   admodereadwrite = 3   对象数据可读写

  end sub

  

  public sub getdata   类的打开过程,上传文件及分析数据的过程

   

   set srmrequestdata = server.createobject("adodb.stream")   建立一个adodb.stream对象

   

   srmrequestdata.type = adtypebinary   指定返回数据类型

   srmrequestdata.mode = admodereadwrite   指定打开模式

   srmrequestdata.open   打开对象

   srmrequestdata.write request.binaryread(request.totalbytes)   获取所有form提交的数据

   

   srmrequestdata.position = 0   读写指针重新定位至对象头部,写数据,指针已指向对象尾

   bindata = srmrequestdata.read   在变量中保存提交数据的复本,便於操作

   

   set dicform = server.createobject("scripting.dictionary") 用来保存文本信息

   set dicfile = server.createobject("scripting.dictionary") 用来保存文件信息

   posb = instrb(bindata,bytsub)   开始分析所获取的二进制数据

   posb = instrb(posb,bindata,bytcrlf) + 2 +2是加入回车换行符本身的长度

   posb = instrb(posb,bindata,getsbfromdb("name=""")) + 6

   do until posb = 6   控制条件的设置有多种方式,这里的仅供叁考

    pose = instrb(posb,bindata,getsbfromdb(""""))

    strname = gettextfrombin(srmrequestdata,posb,pose-posb)

   

    posb = pose + 1 指针移动到“"”的後面

    pose = instrb(posb,bindata,bytcrlf)

    

    if instrb(midb(bindata,posb,pose-posb),getsbfromdb("filename=""")) > 0 then 这是一个file域

     posb = instrb(posb,bindata,getsbfromdb("filename=""")) + 10

     pose = instrb(posb,bindata,getsbfromdb(""""))

     set objfile = new ljfile   建立一个文件信息对象

     if pose>posb then

      objfile.filename = getfilenamefrompath(gettextfrombin(srmrequestdata,posb,pose-posb))   写入文件名称

      posb = instrb(posb,bindata,getsbfromdb("content-type:")) + 14

      pose = instrb(posb,bindata,bytcrlf)

      objfile.contenttype = gettextfrombin(srmrequestdata,posb,pose-posb)   写入文件类型

      posb = pose + 4   这个地方换了两行,具体叁看输出的原始二进制数据

      pose = instrb(posb,bindata,bytsub)

      objfile.filebegin = posb

      objfile.filelen = pose-posb-2   写入文件长度信息,-2是减去一个回车符

     end if

     dicfile.add strname, objfile

     set objfile = nothing   释放文件信息对象

    else   这是一个文本域

     posb = pose + 4 这个地方换了两行,具体叁看输出的原始二进制数据

     pose = instrb(posb,bindata,bytcrlf)

     strvalue = gettextfrombin(srmrequestdata,posb,pose-posb)

     dicform.add strname, strvalue

    end if

    posb = pose + 2

    posb = instrb(posb,bindata,bytcrlf) + 2

    posb = instrb(posb,bindata,getsbfromdb("name=""")) + 6

   loop   当循环结束时分析二进制数据完成

  end sub

  

  private 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 = charset    语言属性设置

   strdata = srmobj.readtext

   srmobj.close

   set srmobj = nothing

   gettextfrombin = strdata

  end function

  private 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

  private 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

  private function getfilenamefrompath(strpath)   从一个完整路径中析出文件名称

   getfilenamefrompath = mid(strpath,instrrev(strpath,"\")+1)

  end function

  public sub about()  关於类过程

   dim html

   html = "<table border=1 cellpadding=2 cellspacing=1>" & "<tr>" & _

       "<td style=font-family:verdana; bgcolor=yellow> <marquee width=160 " & _

       "onmouseover=this.stop(); onmouseout=this.start();>" & _

       "<a href=mailto:java300@163com target=_blank>lijun upload class v1.0</a>" & _

       "</marquee> </td>" & "</tr>" & "</table>"

   response.write html

  end sub

  

  public function form(strformname)  求表单内容的函数

   if dicform.exists(strformname) then

    form = dicform(strformname)

   else

    form = ""

   end if

  end function

  

  public function file(strformname)  求文件内容的函数

   if dicfile.exists(strformname) then

    set file = dicfile(strformname)

   else

    set file = new fileinfo

   end if

  end function

  

  private sub class_terminate   类终止过程

   dicform.removeall

   set dicform = nothing

   dicfile.removeall

   set dicfile = nothing

   srmrequestdata.close

   set srmrequestdata = nothing

  end sub

  

 end class

 class ljfile   文件类

  public filename   文件名

  public contenttype   文件类型

  public filebegin   文件数据开始位置

  public filelen   文件长度,字节数

  private sub class_initalize

   filename = ""

   contenttype = ""

   filebegin = 0

   filelen = 0

  end sub

  public sub savetofile(filepath)   文件保存到磁盘上,filepath为完整路径,包括文件名

   dim srmobj

   set srmobj = server.createobject("adodb.stream")

   srmobj.type = adtypebinary

   srmobj.mode = admodereadwrite

   srmobj.open

   srmrequestdata.position = filebegin-1

   srmrequestdata.copyto srmobj, filelen

   srmobj.position = 0

   srmobj.savetofile filepath, 2   如果该文件已经存在,无条件覆盖,以後根据需要再行完善

   srmobj.close

   set srmobj = nothing

  end sub

  public function getbinarydata()

   srmrequestdata.position = filebegin-1

   getbinarydata = srmrequestdata.read(filelen)

  end function

 end class

</script>

<html>

<head>

<meta name="generator" content="microsoft visual studio 6.0">

<meta http-equiv="content" content="text/html;charset=gb2312">

<title>asp无组件上传类:ljupload</title>

</head>

<body>

<%

if request.servervariables("request_method") = "post" then

 dim upload

 set upload = new ljupload

 upload.charset = "gb2312"   设置文本信息的语言属性

 upload.getdata()

 

 dim title, filimage

 title = upload.form("txttitle")

 response.write title & "<br>"

 set filimage = new ljfile   这句可不用,此处仅为写代码方便

 set filimage = upload.file("filimage")

 response.write filimage.filename & "<br>"

 以文件形式保存到磁盘,文件名是当前日期时间的处理值

 filimage.savetofile server.mappath("./") & "\" & replace(replace(replace(now(),"/","_")," ","_"),":","_") & "." & right(filimage.filename,3)

 

 保存到数据库用以下的代码

 dim cn, rs, sql

 set cn = server.createobject("adodb.connection")

 cn.open "driver={microsoft access driver (*.mdb)};dbq=" & server.mappath("upload.mdb")

 set rs = server.createobject("adodb.recordset")

 sql = "select title,[content-type],image from tblimage"

 rs.open sql,cn,1,3

 rs.addnew

 rs.fields("title").value = title

 rs.fields("content-type").value = filimage.contenttype

 rs.fields("image").appendchunk filimage.getbinarydata()

 rs.update

 rs.close

 set rs = nothing

 cn.close

 set cn = nothing

 upload.about()   关於类信息

 

 set filimage = nothing

 set upload = nothing

end if

%>

 <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>

</body>

</html>

完。

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » ASP文件上传神功 第三重:集成类、多语种通用,使用方便-ASP教程,ASP应用
分享到: 更多 (0)

相关推荐

  • 暂无文章