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
Sam_sha@sina.com.cn
2004-6-7