Example.asp
<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%> <!--#include file="SundyUpload.asp"--> <% '此例子文档编码都是UTF-8,如果是其他编码的系统,请将编码转换为相应的编码,不然表单获取数据可能会乱码 Dim objUpload,opt Dim xmlPath Dim fileFormName,objFile,counter opt = request.QueryString("opt") If opt = "Upload" Then xmlPath = Server.MapPath(request.QueryString("xmlPath"))'将虚拟路径转换为实际路径 Set objUpload=new SundyUpload '建立上传对象 objUpload.UploadInit xmlPath,"utf-8" counter = 1 Response.Write("普通表单:" & objUpload.Form("normalForm") & "<BR><BR>")'获取表单数据 For Each fileFormName In objUpload.objFile Set objFile=objUpload.objFile(fileFormName) fileSize = objFile.FileSize strTemp= objFile.FilePath Response.Write strTemp fileName = mid(strTemp,InStrRev(strTemp, "\")+1) If fileSize > 0 Then Response.Write("File Size:" & fileSize & "<BR>") Response.Write("File Name:" & objFile.FilePath & "<BR>") ' Response.Write("File Description:" & objUpload.Form("fileDesc" & counter) & "<BR><BR>") objFile.SaveAs Server.MapPath(".") & "\upload\" & fileName Response.Write "Save at: "&Server.MapPath(".") & "\upload\" & fileName & "<br><br>" End If counter = counter + 1 Next End If '为上载进度条数据文件(XML文件指定虚拟路径) '最好是随机的,因为可能多个人同时上载,需要不同的进度数据 '这个路径需要在提交的时候传入上载组件中,以便在上载过程中更改进度数据 '客户端使用Javascript来读取此XML文件,显示进度 xmlPath = "upload/" & Timer & ".xml" %> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Sundy Upload Progress Bar Example</title> <script language="javascript"> function chkFrm(){ var objFrm = document.frmUpload; if (objFrm.file1.value=="" && objFrm.file2.value==""){ alert("请选择一个文件"); objFrm.file1.focus(); return false; } objFrm.action = "Example.asp?opt=Upload&xmlPath=<%=xmlPath%>"; startProgress('<%=xmlPath%>');//启动进度条 return true; } </script> </head>
<body> <form name="frmUpload" method="post" action="Example.asp" enctype="multipart/form-data" onSubmit="return chkFrm()"> 普通表单:<BR><input type="text" name="normalForm" size="40"><BR><BR> 文件1:<BR> <input type="file" name="file1" size="40"></br> <input type="text" name="fileDesc1" size="30"><BR><BR> 文件2:<BR> <input type="file" name="file2" size="40"></br> <input type="text" name="fileDesc2" size="30"><BR> 文件3:<BR> <input type="file" name="file3" size="40"></br> 文件4:<BR> <input type="file" name="file4" size="40"></br> 文件5:<BR> <input type="file" name="file5" size="40"></br> <input type="submit" name="btnSubmit" value="submit"/> </form> </body> </html>
SundyUpload.asp
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <% Dim SundyUpload_SourceData Class SundyUpload Dim objForm,objFile,Version,objProgress Dim xmlPath,CharsetEncoding Public Function Form(strForm) strForm=lcase(strForm) If NOT objForm.exists(strForm) Then Form="" Else Form=objForm(strForm) End If End Function
Public Function File(strFile) strFile=lcase(strFile) If NOT objFile.exists(strFile) Then Set File=new FileInfo Else Set File=objFile(strFile) End If End Function Public Sub UploadInit(progressXmlPath,charset) Dim RequestData,sStart,Crlf,sInfo,iInfoStart,iInfoEnd,tStream,iStart,theFile Dim iFileSize,sFilePath,sFileType,sFormValue,sFileName Dim iFindStart,iFindEnd Dim iFormStart,iFormEnd,sFormName Version="Upload Width Progress Bar Version 1.0" Set objForm=Server.CreateObject("Scripting.Dictionary") Set objFile=Server.CreateObject("Scripting.Dictionary") If Request.TotalBytes<1 Then Exit Sub Set tStream = Server.CreateObject("adodb.stream") Set SundyUpload_SourceData = Server.CreateObject("adodb.stream") SundyUpload_SourceData.Type = 1 SundyUpload_SourceData.Mode =3 SundyUpload_SourceData.Open Dim TotalBytes Dim ChunkReadSize Dim DataPart, PartSize Dim objProgress TotalBytes = Request.TotalBytes ' 总大小 ChunkReadSize = 64 * 1024 ' 分块大小64K BytesRead = 0 xmlPath = progressXmlPath CharsetEncoding = charset If CharsetEncoding = "" Then CharsetEncoding = "utf-8" End If Set objProgress = New Progress objProgress.ProgressInit(xmlPath) objProgress.UpdateProgress Totalbytes,0 '循环分块读取 Do While BytesRead < TotalBytes '分块读取 PartSize = ChunkReadSize If PartSize + BytesRead > TotalBytes Then PartSize = TotalBytes - BytesRead DataPart = Request.BinaryRead(PartSize) BytesRead = BytesRead + PartSize SundyUpload_SourceData.Write DataPart objProgress.UpdateProgress Totalbytes,BytesRead Loop 'SundyUpload_SourceData.Write Request.BinaryRead(Request.TotalBytes) SundyUpload_SourceData.Position=0 RequestData =SundyUpload_SourceData.Read iFormStart = 1 iFormEnd = LenB(RequestData) Crlf = chrB(13) & chrB(10) sStart = MidB(RequestData,1, InStrB(iFormStart,RequestData,Crlf)-1) iStart = LenB (sStart) iFormStart=iFormStart+iStart+1 While (iFormStart + 10) < iFormEnd iInfoEnd = InStrB(iFormStart,RequestData,Crlf & Crlf)+3 tStream.Type = 1 tStream.Mode =3 tStream.Open SundyUpload_SourceData.Position = iFormStart SundyUpload_SourceData.CopyTo tStream,iInfoEnd-iFormStart tStream.Position = 0 tStream.Type = 2 tStream.Charset =CharsetEncoding sInfo = tStream.ReadText tStream.Close '取得表单项目名称 iFormStart = InStrB(iInfoEnd,RequestData,sStart) iFindStart = InStr(22,sInfo,"name=""",1)+6 iFindEnd = InStr(iFindStart,sInfo,"""",1) sFormName = lcase(Mid (sinfo,iFindStart,iFindEnd-iFindStart)) '如果是文件 If InStr (45,sInfo,"filename=""",1) > 0 Then Set theFile=new FileInfo '取得文件名 iFindStart = InStr(iFindEnd,sInfo,"filename=""",1)+10 iFindEnd = InStr(iFindStart,sInfo,"""",1) sFileName = Mid (sinfo,iFindStart,iFindEnd-iFindStart) theFile.FileName=getFileName(sFileName) theFile.FilePath=getFilePath(sFileName) '取得文件类型 iFindStart = InStr(iFindEnd,sInfo,"Content-Type: ",1)+14 iFindEnd = InStr(iFindStart,sInfo,vbCr) theFile.FileType =Mid (sinfo,iFindStart,iFindEnd-iFindStart) theFile.FileStart =iInfoEnd theFile.FileSize = iFormStart -iInfoEnd -3 theFile.FormName=sFormName If NOT objFile.Exists(sFormName) Then objFile.add sFormName,theFile End If Else '如果是表单项目 tStream.Type =1 tStream.Mode =3 tStream.Open SundyUpload_SourceData.Position = iInfoEnd SundyUpload_SourceData.CopyTo tStream,iFormStart-iInfoEnd-3 tStream.Position = 0 tStream.Type = 2 tStream.Charset = CharsetEncoding sFormValue = tStream.ReadText tStream.Close If objForm.Exists(sFormName) Then objForm(sFormName)=objForm(sFormName)&", "&sFormValue Else objForm.Add sFormName,sFormValue End If End If iFormStart=iFormStart+iStart+1 Wend RequestData="" Set tStream = Nothing End Sub Private Sub Class_Initialize End Sub Private Sub Class_Terminate If Request.TotalBytes>0 Then objForm.RemoveAll objFile.RemoveAll Set objForm=Nothing Set objFile=Nothing SundyUpload_SourceData.Close Set SundyUpload_SourceData = Nothing End If Set objProgress = Nothing Set objFso = Server.CreateObject("Scripting.FileSystemObject") If objFso.FileExists(xmlPath) Then objFso.DeleteFile(xmlPath) End If Set objFso = Nothing End Sub Private Function GetFilePath(FullPath) If FullPath <> "" Then GetFilePath = left(FullPath,InStrRev(FullPath, "")) Else GetFilePath = "" End If End Function |