最快的ASP无组件上传类(4M只需10秒)0.96版

 <%
'----------------------------------------------------------------------
'转发时请保留此声明信息,这段声明不并会影响你的速度!
'******************* 无组件上传类 ********************************
'修改者:梁无惧
'电子邮件:yjlrb@21cn.com
'网站:http://www.25cn.com
'原作者:稻香老农
'原作者网站:http://www.5xsoft.com
'声明:此上传类是在化境编程界发布的无组件上传类的基础上修改的.
'在与化境编程界无组件上传类相比,速度快了将近50倍,当上传4M大小的文件时
'服务器只需要10秒就可以处理完,是目前最快的无组件上传程序,当前版本为0.96
'源代码公开,免费使用,对于商业用途,请与作者联系
'文件属性:例如上传文件为c:/myfile/doc.txt
'FileName 文件名 字符串 "doc.txt"
'FileSize 文件大小 数值 1210
'FileType 文件类型 字符串 "text/plain"
'FileExt 文件扩展名 字符串 "txt"
'FilePath 文件原路径 字符串 "c:/myfile"
'使用时注意事项:
'由于Scripting.Dictionary区分大小写,所以在网页及ASP页的项目名都要相同的大小
'写,如果人习惯用大写或小写,为了防止出错的话,可以把
'sFormName = Mid (sinfo,iFindStart,iFindEnd-iFindStart)
'改为
'(小写者)sFormName = LCase(Mid (sinfo,iFindStart,iFindEnd-iFindStart))
'(大写者)sFormName = UCase(Mid (sinfo,iFindStart,iFindEnd-iFindStart))
'**********************************************************************
'----------------------------------------------------------------------
dim oUpFileStream

Class upload_file

dim Form,File,Version

Private Sub Class_Initialize
'定义变量
dim RequestBinDate,sStart,bCrLf,sInfo,iInfoStart,iInfoEnd,tStream,iStart,oFileInfo
dim iFileSize,sFilePath,sFileType,sFormValue,sFileName
dim iFindStart,iFindEnd
dim iFormStart,iFormEnd,sFormName
'代码开始
Version="无组件上传类 Version 0.96"
set Form = Server.CreateObject("Scripting.Dictionary")
set File = Server.CreateObject("Scripting.Dictionary")
if Request.TotalBytes < 1 then Exit Sub
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)
'取得每个项目之间的分隔符
sStart = MidB(RequestBinDate,1, InStrB(1,RequestBinDate,bCrLf)-1)
iStart = LenB (sStart)
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,sStart)-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
'取得文件属性
iFindStart = InStr(iFindEnd,sInfo,"filename=""",1)+10
iFindEnd = InStr(iFindStart,sInfo,"""",1)
sFileName = Mid (sinfo,iFindStart,iFindEnd-iFindStart)
oFileInfo.FileName = GetFileName(sFileName)
oFileInfo.FilePath = GetFilePath(sFileName)
oFileInfo.FileExt = GetFileExt(sFileName)
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
form.Add sFormName,sFormValue
end if
tStream.Close
iFormStart = iFormStart+iStart+2
'如果到文件尾了就退出
loop until (iFormStart+2) = iFormEnd
RequestBinD

 

 

<
' ---------------------------------------------------------------------- 
'
转发时请保留此声明信息,这段声明不并会影响你的速度! 
'
******************* 无惧上传类 V1.2 ************************************ 
'
作者:梁无惧 
'
网站:http://www.25cn.com 
'
电子邮件:yjlrb@21cn.com 
'
版权声明:版权所有,源代码公开,各种用途均可免费使用,但是修改后必须把修改后的文件 
'
发送一份给作者.并且保留作者此版权信息 
'
********************************************************************** 
'
---------------------------------------------------------------------- 
Dim  oUpFileStream 
' ---------------------------------------------------------------------- 
'
文件上传类 
Class UpFile_Class 

Dim  Form,File,Version,Err 

Private   Sub  Class_Initialize 
Version 
=   " 无惧上传类 Version V1.2 "  
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 (MaxSize) 
' 定义变量 
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  MaxSize  >   0   Then   ' 如果限制大小 
If  Request.TotalBytes  >  MaxSize  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,  " " )) 
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  
End Function  

' 取得文件数据 
Public   Function  FileData 
oUpFileStream.Position 
=  FileStart 
FileData 
=  oUpFileStream.Read (FileSize) 
End Function  

End  Class 
%
>  
艾恩ASP无组件上传,不敢夸口说多完美,但能实现基本的功能.包括提取表单数据、上传到不同文件夹、保存到 数据库(上传和保存表单可同时进行)、限制上传扩展名、限制上传大小、选择文件保存型(原文件名和时间随机命名)等! 本可以完整保存用户信息,包括同名称表单(和request.form一样以,为分割符进行保存),以及文件域的客户端路径。 处理完数据后,程序会提供两个方法-----files和forms,通过这两个方法实现文件的保存以及信息的读取,并且可以调用 fileaction的GetBytes方法获取文件的二进制数据,可以把此数据保存到数据库(作者不推荐把二进制保存到数据库, 会影响数据库性能)。 此最大的优点更多表现在多文件上传,即可以使用循环把所有文件保存到同一目录,又可以单独操作保存到不同目 录,灵活性相当高,完全脱离其他任何对象的束缚。并且可以自主选择保存方式--以原文件名保存或以程序自动生成的文 件名(时间 随机数字)保存 本特点: • 尽量追求简洁,减少赘余代码 • 全面保存客户提交的信息(普通表单,文件域值,相同表单值) • 准确获取上传中的错误信息 • 可选择文件保存方式(以原文件名保存和以新文件名保存,新文件名为时间 随机数字组 • 文件保存函数简洁,调用方便,并且比较灵活(保存路径和保存方式可随时改变) • 同时可以获取文件的二进制形式,从而可以实现将二进制数据保存到数据库 • 灵活运用本,可以实现表单数据和文件同时编辑(这是一般无法达到的) • 更多的用途靠大家来发现了..... • Demo里面有几个个很简单的例子,能掌握这几个个例子一定可以灵活使用本 更新日期:2011-3-25 1.修正上传数据丢失的错误. 2.去除自动获取图片宽高的代码。
无组件ASP文件上传源代码 记得在建立一个文件夹"updata" saveannounce_upload.asp 上传页 ------------------------------------ body {font-size:9pt;} input {font-size:9pt;} 文件上传 文件 ------------------------------------ saveannouce_upfile.asp 保存文件到服务器 ------------------------------------ 文件上传 <% dim upload,file,formName,formPath set upload=new upload_5xSoft ''建立上传对象 formPath=upload.form("filepath") ''在目录后加(/) if right(formPath,1)"/" then formPath=formPath&"/" for each formName in upload.file ''列出所有上传了的文件 set file=upload.file(formName) ''生成一个文件对象 if file.filesize<100 then response.write "请先选择你要上传的文件 [ 重新上传 ]" response.end end if if file.filesize>500*1000 then '设置上传文件大小为500K response.write "文件大小超过了限制 500K [ 重新上传 ]" response.end end if if file.FileSize>0 then ''如果 FileSize > 0 说明有文件数据 file.SaveAs Server.mappath("updata\"&file.FileName) ''保存文件 end if set file=nothing next set upload=nothing response.write "文件上传成功 [ 继续上传 ]" %> ------------------------------------ upload.inc 建立upload对象 ------------------------------------ dim upfile_5xSoft_Stream Class upload_5xSoft dim Form,File,Version Private Sub Class_Initialize dim iStart,iFileNameStart,iFileNameEnd,iEnd,vbEnter,iFormStart,iFormEnd,theFile dim strDiv,mFormName,mFormValue,mFileName,mFileSize,mFilePath,iDivLen,mStr Version="" if Request.TotalBytes<1 then Exit Sub set Form=CreateObject("Scripting.Dictionary") set File=CreateObject("Scripting.Dictionary") set upfile_5xSoft_Stream=CreateObject("Adodb.Stream") upfile_5xSoft_Stream.mode=3 upfile_5xSoft_Stream.type=1 upfile_5xSoft_Stream.open upfile_5xSoft_Stream.write Request.BinaryRead(Request.TotalBytes) vbEnter=Chr(13)&Chr(10) iDivLen=inString(1,vbEnter)+1 strDiv=subString(1,iDivLen) iFormStart=iDivLen iFormEnd=inString(iformStart,strDiv)-1 while iFormStart 0 and iFileNameStartiStart then mFileSize=iEnd-iStart-4 else mFileSize=0 end if set theFile=new FileInfo theFile.FileName=getFileName(mFileName) theFile.FilePath=getFilePath(mFileName) theFile.FileSize=mFileSize theFile.FileStart=iStart+4 theFile.FormName=FormName file.add mFormName,theFile else iStart=inString(iEnd+1,vbEnter&vbEnter) iEnd=inString(iStart+4,vbEnter&strDiv) if iEnd>iStart then mFormValue=subString(iStart+4,iEnd-iStart-4) else mFormValue="" end if form.Add mFormName,mFormValue end if iFormStart=iformEnd+iDivLen iFormEnd=inString(iformStart,strDiv)-1 wend End Sub Private Function subString(theStart,theLen) dim i,c,stemp upfile_5xSoft_Stream.Position=theStart-1 stemp="" for i=1 to theLen if upfile_5xSoft_Stream.EOS then Exit for c=ascB(upfile_5xSoft_Stream.Read(1)) If c > 127 Then if upfile_5xSoft_Stream.EOS then Exit for stemp=stemp&Chr(AscW(ChrB(AscB(upfile_5xSoft_Stream.Read(1)))&ChrB(c))) i=i+1 else stemp=stemp&Chr(c) End If Next subString=stemp End function Private Function inString(theStart,varStr) dim i,j,bt,theLen,str InString=0 Str=toByte(varStr) theLen=LenB(Str) for i=theStart to upfile_5xSoft_Stream.Size-theLen if i>upfile_5xSoft_Stream.size then exit Function upfile_5xSoft_Stream.Position=i-1 if AscB(upfile_5xSoft_Stream.Read(1))=AscB(midB(Str,1)) then InString=i for j=2 to theLen if upfile_5xSoft_Stream.EOS then inString=0 Exit for end if if AscB(upfile_5xSoft_Stream.Read(1))AscB(MidB(Str,j,1)) then InString=0 Exit For end if next if InString0 then Exit Function end if next End Function Private Sub Class_Terminate form.RemoveAll file.RemoveAll set form=nothing set file=nothing upfile_5xSoft_Stream.close set upfile_5xSoft_Stream=nothing End Sub Private function GetFilePath(FullPath) If FullPath "" Then GetFilePath = left(FullPath,InStrRev(FullPath, "\")) Else GetFilePath = "" End If End function Private function GetFileName(FullPath) If FullPath "" Then GetFileName = mid(FullPath,InStrRev(FullPath, "\")+1) Else GetFileName = "" End If End function Private function toByte(Str) dim i,iCode,c,iLow,iHigh toByte="" For i=1 To Len(Str) c=mid(Str,i,1) iCode =Asc(c) If iCode255 Then iLow = Left(Hex(Asc(c)),2) iHigh =Right(Hex(Asc(c)),2) toByte = toByte & chrB("&H"&iLow) & chrB("&H"&iHigh) Else toByte = toByte & chrB(AscB(c)) End If Next End function End Class Class FileInfo dim FormName,FileName,FilePath,FileSize,FileStart Private Sub Class_Initialize FileName = "" FilePath = "" FileSize = 0 FileStart= 0 FormName = "" End Sub Public function SaveAs(FullPath) dim dr,ErrorChar,i SaveAs=1 if trim(fullpath)="" or FileSize=0 or FileStart=0 or FileName="" then exit function if FileStart=0 or right(fullpath,1)="/" then exit function set dr=CreateObject("Adodb.Stream") dr.Mode=3 dr.Type=1 dr.Open upfile_5xSoft_Stream.position=FileStart-1 upfile_5xSoft_Stream.copyto dr,FileSize dr.SaveToFile FullPath,2 dr.Close set dr=nothing SaveAs=0 end function End Class
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值