ASP 无组件上传

类别:Asp 点击:0 评论:0 推荐:

ASP 无组件上传

 

说明:从网上收集了一部分,自己写了一部分。主要提升就是对于form的二进制数据进行了类封装,可以容易的得到form内的元素的信息。

 

Form 二进制数据格式:

 

       分割标志数据 + 0x0D0A

       元素说明信息 + 0x0D0A0D0A

       元素内容数据 + 0x0D0A

      

分割标志数据 + 0x0D0A

       元素说明信息 + 0x0D0A0D0A

       元素内容数据 + 0x0D0A

      

       ……

      

分割标志数据 + 0x0D0A

 

 

1.  Upload.htm

 

<html>

  <head><title>文件上传</title></head>

  <body>

       <form enctype="multipart/form-data" action="upload.asp" method="post">

              <input name="text0" type=text value="文本框"><br> 

              <input name="file1" type=file accept="image/*"><br>

              <input name="file2" type=file accept="image/*"><br>

              <input type=submit value="上传">

       </form>

  </body>

</html>

 

2.  upload.asp

<!--#include file="upload.inc"-->

<%

'by sam 2004,6

'###############################################################################

response.expires = 0

 

if request.servervariables("REQUEST_METHOD")="POST" then

response.clear()

response.buffer=true

 

set uform = new uploadform

uform.find_element "text0"

 

data = midb(uform.formdata,uform.datastart,uform.datalen)

Response.binaryWrite data

sdata = binarytostring(data)

Response.write sdata

Response.binarywrite stringtobinary(sdata)

 

 

 

 

uform.find_element "file1"

savefile  server.mappath("/recv1.dat"),uform.formdata,uform.datastart,uform.datalen

 

uform.find_element "file2"

savefile  server.mappath("/recv2.dat"),uform.formdata,uform.datastart,uform.datalen

 

 

set uform = nothing

 

end if

%>

 

3. upload.inc

<%

'by sam  2004,6

'#################################################################

function savefile(filename,formdata,start,len)

 

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

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

strm1.open

strm1.type=1 'binary

strm2.open

strm2.type=1 'binary

strm1.write formdata

'strm1.savetofile server.mappath("/1.raw"),2

strm1.position = start - 1

strm1.copyto strm2,len

'strm2.savetofile server.mappath("/1.gif"),2

strm2.savetofile filename,2

set strm1=nothing

set strm2=nothing

 

end function

 

 

function simplebinarytostring(binary)

  dim i, s

  for i = 1 to lenb(binary)

    s = s & chr(ascb(midb(binary,i,1)))

  next

  simplebinarytostring = s

end function

 

function binarytostring(binary)

  dim cl1,cl2,cl3,pl1,pl2,pl3

  dim l

  cl1 = 1

  cl2 = 1

  cl3 = 1

  l = lenb(binary)

 

  do while cl1<=l

    pl3 = pl3 & chr(ascb(midb(binary,cl1,1)))

    cl1 = cl1 + 1

    cl3 = cl3 + 1

    if cl3>300 then

      pl2 = pl2 & pl3

      pl3 = ""

      cl3 = 1

      cl2 = cl2 + 1

      if cl2>200 then

        pl1 = pl1 & pl2

        pl2 = ""

        cl2 = 1

      end if

    end if

  loop

  binarytostring = pl1 & pl2 & pl3

end function

 

 

function stringtobinary(string)

dim i, b

for i=1 to len(string)

b = b & chrb(asc(mid(string,i,1)))

next

stringtobinary = b

end function

 

 

 

 

class uploadform

      

       private sub class_initialize()

              datastart = 0

              datalen = 0     

              formsize=request.totalbytes

              formdata=request.binaryread(formsize)

              'response.write "<br>myclass start<br>"

       end sub

      

      

       private sub class_terminate()

              'response.write "<br>myclass over<br>"

       end sub

      

        public datastart

        public datalen

       

        public formsize

        public formdata

       

      

       public sub find_element( name)

      

       datastart = 0

       datalen = 0

      

       bncrlf=chrb(13) & chrb(10)

       strname = "name=" & chr(34) & name & chr(34)

      

       spos = 1

       epos = 1

      

       k = 0

      

       do while ( spos < formsize)

      

       epos = instrb(spos,formdata,bncrlf)

       divider = midb(formdata,spos, epos - spos)

       sdivider = binarytostring (divider)

       'response.write sdivider & "<br>"

       'response.binarywrite divider & "<br>"

      

       spos = epos + 2

       epos = instrb(spos,formdata,bncrlf & bncrlf)

       header = midb(formdata,spos,epos - spos)

       sheader = binarytostring (header)

       'response.write sheader & "<br>"

       'response.binarywrite header & "<br>"

      

       spos = epos + 4

       epos = instrb(spos,formdata,divider)

      

       if instr(sheader,strname) > 0  then

              datastart = spos  'base 1

              datalen = epos - spos - 2

             

              'response.write "start = " & datastart & "<br>"

              'response.write "  end = " & datalen & "<br>"

              'savefile server.mappath("/output.dat"),formdata, datastart,datalen

              exit do    

             

       end if

      

      

       spos = epos

      

       k = k + 1

       if ( k > 20 ) then

        exit do

       end if     

      

       loop

      

       end sub

 end class

 

%>

 

 

Sam Sha

[email protected]

2004-6-7

 

本文地址:http://com.8s8s.com/it/it8960.htm