asp无组件文件上传的实例
1.库文件(upload.inc.asp)
<%
dim oupfilestream
class upfile_class
dim form,file,version,err
private sub class_initialize
version = "无组件上传类 version v1.0"
err = -1
end sub
private sub class_terminate
'清除变量及对像
if err < 0 then
form.removeall
set form = nothing
file.removeall
set file = nothing
oupfilestream.close
set oupfilestream = nothing
end if
end sub
public sub getdata (retsize)
'定义变量
dim requestbindate,sspace,bcrlf,sinfo,iinfostart,iinfoend,tstream,istart,ofileinfo
dim ifilesize,sfilepath,sfiletype,sformvalue,sfilename
dim ifindstart,ifindend
dim iformstart,iformend,sformname
'代码开始
if request.totalbytes < 1 then
err = 1
exit sub
end if
if retsize > 0 then
if request.totalbytes > retsize then
err = 2
exit sub
end if
end if
set form = server.createobject ("scripting.dictionary")
form.comparemode = 1
set file = server.createobject ("scripting.dictionary")
file.comparemode = 1
set tstream = server.createobject ("adodb.stream")
set oupfilestream = server.createobject ("adodb.stream")
oupfilestream.type = 1
oupfilestream.mode = 3
oupfilestream.open
oupfilestream.write request.binaryread (request.totalbytes)
oupfilestream.position = 0
requestbindate = oupfilestream.read
iformend = oupfilestream.size
bcrlf = chrb (13) & chrb (10)
'取得每个项目之间的分隔符
sspace = midb (requestbindate,1, instrb (1,requestbindate,bcrlf)-1)
istart = lenb (sspace)
iformstart = istart+2
'分解项目
do
iinfoend = instrb (iformstart,requestbindate,bcrlf & bcrlf)+3
tstream.type = 1
tstream.mode = 3
tstream.open
oupfilestream.position = iformstart
oupfilestream.copyto tstream,iinfoend-iformstart
tstream.position = 0
tstream.type = 2
tstream.charset = "gb2312"
sinfo = tstream.readtext
'取得表单项目名称
iformstart = instrb (iinfoend,requestbindate,sspace)-1
ifindstart = instr (22,sinfo,"name=""",1)+6
ifindend = instr (ifindstart,sinfo,"""",1)
sformname = mid (sinfo,ifindstart,ifindend-ifindstart)
'如果是文件
if instr (45,sinfo,"filename=""",1) > 0 then
set ofileinfo = new fileinfo_class
'取得文件属性
ifindstart = instr (ifindend,sinfo,"filename=""",1)+10
ifindend = instr (ifindstart,sinfo,"""",1)
sfilename = mid (sinfo,ifindstart,ifindend-ifindstart)
ofileinfo.filename = mid (sfilename,instrrev (sfilename, "\")+1)
ofileinfo.filepath = left (sfilename,instrrev (sfilename, "\")+1)
ofileinfo.fileext = mid (sfilename,instrrev (sfilename, ".")+1)
ifindstart = instr (ifindend,sinfo,"content-type: ",1)+14
ifindend = instr (ifindstart,sinfo,vbcr)
ofileinfo.filetype = mid (sinfo,ifindstart,ifindend-ifindstart)
ofileinfo.filestart = iinfoend
ofileinfo.filesize = iformstart -iinfoend -2
ofileinfo.formname = sformname
file.add sformname,ofileinfo
else
'如果是表单项目
tstream.close
tstream.type = 1
tstream.mode = 3
tstream.open
oupfilestream.position = iinfoend
oupfilestream.copyto tstream,iformstart-iinfoend-2
tstream.position = 0
tstream.type = 2
tstream.charset = "gb2312"
sformvalue = tstream.readtext
if form.exists (sformname) then
form (sformname) = form (sformname) & ", " & sformvalue
else
form.add sformname,sformvalue
end if
end if
tstream.close
iformstart = iformstart+istart+2
'如果到文件尾了就退出
loop until (iformstart+2) = iformend
requestbindate = ""
set tstream = nothing
end sub
end class
'文件属性类
class fileinfo_class
dim formname,filename,filepath,filesize,filetype,filestart,fileext
'保存文件方法
public function savetofile (path)
on error resume next
dim ofilestream
set ofilestream = createobject ("adodb.stream")
ofilestream.type = 1
ofilestream.mode = 3
ofilestream.open
oupfilestream.position = filestart
oupfilestream.copyto ofilestream,filesize
ofilestream.savetofile path,2
ofilestream.close
set ofilestream = nothing
if err.number<>0 then
savetofile=err.number&"**"&err.descripton
else
savetofile="ok"
end if
end function
'取得文件数据
public function filedate
oupfilestream.position = filestart
filedate = oupfilestream.read (filesize)
end function
end class
%>
2.处理用户提交后的页面(upload.asp)
<!--#include file="upload.inc.asp"-->
<html>
<head>
<title>文件上传</title>
</head>
<body topmargin="0" leftmargin="0">
<table width=100% border=0 cellspacing="0" cellpadding="0"><tr><td class=tablebody1 width=100% height=100% >
<%
dim upload,file,formname,formpath,filename,fileext
dim rannum
call upfile()
'===========无组件上传(upload_0)====================
sub upfile()
set upload=new upfile_class '建立上传对象
upload.getdata (500*1024) '取得上传数据,此处即为500 k
if upload.err > 0 then
select case upload.err
case 1
response.write "请先选择你要上传的文件 [ <a href=# onclick=history.go(-1)>重新上传</a> ]"
case 2
response.write "图片大小超过了限制 500 k [ <a href=# onclick=history.go(-1)>重新上传</a> ]"
end select
exit sub
else
formpath=upload.form("filepath") '文件保存目录,此目录必须为程序可读写
if formpath="" then
formpath="rwdata/"
end if
'在目录后加(/)
if right(formpath,1)<>"/" then
formpath=formpath&"/"
end if
for each formname in upload.file '列出所有上传了的文件
set file=upload.file(formname) '生成一个文件对象
if file.filesize<100 then
response.write "请先选择你要上传的图片 [ <a href=# onclick=history.go(-1)>重新上传</a> ]"
response.end
end if
fileext=lcase(file.fileext)
if checkfileext(fileext)=false then
response.write "文件格式不正确 [ <a href=# onclick=history.go(-1)>重新上传</a> ]"
response.end
end if
'randomize
rannum=int(90000*rnd)+10000
filename=formpath&year(now)&month(now)&day(now)&hour(now)&minute(now)&second(now)&rannum&"."&fileext
if file.filesize>0 then '如果 filesize > 0 说明有文件数据
result=file.savetofile(server.mappath(filename)) '保存文件
if result="ok" then
response.write formname&" upload ok, had saved to "&filename&"<br>"
else
response.write formname&" upload fail,"&result&"<br>"
end if
end if
set file=nothing
next
set upload=nothing
end if
end sub
'判断文件类型是否合格
private function checkfileext (fileext)
dim forumupload
forumupload="gif,jpg,bmp,jpeg"
forumupload=split(forumupload,",")
for i=0 to ubound(forumupload)
if lcase(fileext)=lcase(trim(forumupload(i))) then
checkfileext=true
exit function
else
checkfileext=false
end if
next
end function
%>
</td></tr></table>
</body>
</html>