网站制作学习网ASP→正文:ASP无组件上载,带进度条,多文件上载
字体:

ASP无组件上载,带进度条,多文件上载

ASP 2007/12/29 13:08:03  点击:不统计

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文件,显示进度





伊图教程网[www.etoow.com]

http://www.etoow.com/html/2007-12/1198302331.html

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")



伊图教程网[www.etoow.com]

http://www.etoow.com/html/2007-12/1198302331-1.html

    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)





伊图教程网[www.etoow.com]

http://www.etoow.com/html/2007-12/1198302331-2.html

        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



  Private Function GetFileName(FullPath)

    If FullPath <> "" Then

     GetFileName = mid(FullPath,InStrRev(FullPath, "")+1)

    Else

     GetFileName = ""

    End If

  End Function

End Class



Class FileInfo

 Dim FormName,FileName,FilePath,FileSize,FileType,FileStart

 Private Sub Class_Initialize

  FileName = ""

  FilePath = ""

  FileSize = 0

  FileStart= 0



伊图教程网[www.etoow.com]

http://www.etoow.com/html/2007-12/1198302331-3.html

  FormName = ""



  FileType = ""

 End Sub



  Public Function SaveAs(FullPath)

    Dim dr,ErrorChar,i

    SaveAs=True

 'Response.Write fullpath & ".....................<br>"

 'FileName="ss.txt"

    If trim(fullpath)="" or FileStart=0 or fileName="" or right(fullpath,1)="/" Then Exit Function

 'Response.Write "2........................<br>"

    Set dr=CreateObject("Adodb.Stream")

    dr.Mode=3

    dr.Type=1

    dr.Open

    SundyUpload_SourceData.position=FileStart

    SundyUpload_SourceData.copyto dr,FileSize

    dr.SaveToFile FullPath,2

    dr.Close

    Set dr=Nothing

    SaveAs=False

  End Function

End Class



Class Progress

 Dim objDom,xmlPath

  Dim startTime

 Private Sub Class_Initialize



  End Sub



  Public Sub ProgressInit(xmlPathTmp)

   Dim objRoot,objChild

    Dim objPI



    xmlPath = xmlPathTmp

    Set objDom = Server.CreateObject("Microsoft.XMLDOM")

    Set objRoot = objDom.createElement("progress")



  objDom.appendChild objRoot



    Set objChild = objDom.createElement("totalbytes")

    objChild.Text = "0"

    objRoot.appendChild objChild

    Set objChild = objDom.createElement("uploadbytes")

    objChild.Text = "0"

    objRoot.appendChild objChild

    Set objChild = objDom.createElement("uploadpercent")

    objChild.Text = "0%"

    objRoot.appendChild objChild

    Set objChild = objDom.createElement("uploadspeed")

    objChild.Text = "0"

    objRoot.appendChild objChild

    Set objChild = objDom.createElement("totaltime")

    objChild.Text = "00:00:00"

    objRoot.appendChild objChild

    Set objChild = objDom.createElement("lefttime")

    objChild.Text = "00:00:00"

    objRoot.appendChild objChild



    Set objPI = objDom.createProcessingInstruction("xml","version='1.0' encoding='utf-8'")

    objDom.insertBefore objPI, objDom.childNodes(0)

    objDom.Save xmlPath

    Set objPI = Nothing

    Set objChild = Nothing

    Set objRoot = Nothing

    Set objDom = Nothing

  End Sub



  Sub UpdateProgress(tBytes,rBytes)

   Dim eTime,currentTime,speed,totalTime,leftTime,percent

    If rBytes = 0 Then

      startTime = Timer

      Set objDom = Server.CreateObject("Microsoft.XMLDOM")

      objDom.load(xmlPath)

      objDom.selectsinglenode("//totalbytes").text=tBytes





伊图教程网[www.etoow.com]

http://www.etoow.com/html/2007-12/1198302331-4.html

      objDom.save(xmlPath)

    Else

     speed = 0.0001

     currentTime = Timer

    eTime = currentTime - startTime

      If eTime>0 Then speed = rBytes / eTime

      totalTime = tBytes / speed

      leftTime = (tBytes - rBytes) / speed

      percent = Round(rBytes *100 / tBytes)

      'objDom.selectsinglenode("//uploadbytes").text = rBytes

      'objDom.selectsinglenode("//uploadspeed").text = speed

      'objDom.selectsinglenode("//totaltime").text = totalTime

      'objDom.selectsinglenode("//lefttime").text = leftTime

      objDom.selectsinglenode("//uploadbytes").text = FormatFileSize(rBytes) & " / " & FormatFileSize(tBytes)

      objDom.selectsinglenode("//uploadpercent").text = percent

      objDom.selectsinglenode("//uploadspeed").text = FormatFileSize(speed) & "/sec"

      objDom.selectsinglenode("//totaltime").text = SecToTime(totalTime)

      objDom.selectsinglenode("//lefttime").text = SecToTime(leftTime)

      objDom.save(xmlPath)

    End If

  End Sub



  private Function SecToTime(sec)

    Dim h:h = "0"

    Dim m:m = "0"

    Dim s:s = "0"

    h = round(sec / 3600)

    m = round( (sec mod 3600) / 60)

    s = round(sec mod 60)

    If LEN(h)=1 Then h = "0" & h

    If LEN(m)=1 Then m = "0" & m

    If LEN(s)=1 Then s = "0" & s

    SecToTime = (h & ":" & m & ":" & s)

  End Function



  private Function FormatFileSize(fsize)

    Dim radio,k,m,g,unitTMP

    k = 1024

 m = 1024*1024

    g = 1024*1024*1024

    radio = 1

    If Fix(fsize / g) > 0.0 Then

      unitTMP = "GB"

      radio = g

    ElseIf Fix(fsize / m) > 0 Then

      unitTMP = "MB"

      radio = m

    ElseIf Fix(fsize / k) > 0 Then

      unitTMP = "KB"

      radio = k

    Else

      unitTMP = "B"

      radio = 1

    End If

    If radio = 1 Then

      FormatFileSize = fsize & "&nbsp;" & unitTMP

    Else

      FormatFileSize = FormatNumber(fsize/radio,3) & unitTMP

    End If

  End Function



  Private Sub Class_Terminate

   Set objDom = Nothing

  End Sub

End Class

%>

<script language="javascript">

//启动进度条

function startProgress(xmlPath){

 displayProgress();

  setProgressDivPos();

  setTimeout("DisplayProgressBar('" + xmlPath + "')",500);

}



function DisplayProgressBar(xmlPath){



伊图教程网[www.etoow.com]

http://www.etoow.com/html/2007-12/1198302331-5.html

  var xmlDoc = new ActiveXObject("Msxml2.DOMDocument.3.0");



  xmlDoc.async = false;

  xmlDoc.load(xmlPath);

  if (xmlDoc.parseError.errorCode!=0){

    var error = xmlDoc.parseError;

    alert(error.reason)

    setTimeout("DisplayProgressBar('" + xmlPath + "')",1000);

    return;

  }

  var root = xmlDoc.documentElement;  //根节点

  var totalbytes = root.childNodes(0).text;

  var uploadbytes = root.childNodes(1).text;

  var percent = root.childNodes(2).text;

  ProgressPercent.innerHTML = percent + "%";

  ProgressBar.style.width = percent + "%";

  uploadSize.innerHTML = uploadbytes;

 uploadSpeed.innerHTML = root.childNodes(3).text;

  totalTime.innerHTML = root.childNodes(4).text;

  leftTime.innerHTML = root.childNodes(5).text;

  if (percent<100){

   setTimeout("DisplayProgressBar('" + xmlPath + "')",1000);

  }

}



function displayProgress(){

  var objProgress = document.getElementById("Progress");

 objProgress.style.display = "";

}

function closeProgress(){

  var objProgress = document.getElementById("Progress");

 objProgress.style.display = "none";

}

function setProgressDivPos(){

  var objProgress = document.getElementById("Progress");

  objProgress.style.top = document.body.scrollTop+(document.body.clientHeight-document.getElementById("Progress").offsetHeight)/2

  objProgress.style.left = document.body.scrollLeft+(document.body.clientWidth-document.getElementById("Progress").offsetWidth)/2;

}

</script>



<style type="text/css">

.progress {

  position: absolute;

  padding: 4px;

  top: 50;

  left: 400;

  font-family: Verdana, Helvetica, Arial, sans-serif;

  font-size: 12px;

  width: 250px;

  height:100px;

  background: #FFFBD1;

  color: #3D2C05;

  border: 1px solid #715208;

  /* Mozilla proprietary */

  -moz-border-radius: 5px;

  /*-moz-opacity: 0.95; */

}

.progress table,.progress td{

 font-size:9pt;

}



.Bar{

 width:100%;

  height:15px;

  background-color:#CCCCCC;

  border: 1px inset #666666;

  margin-bottom:4px;

}



.ProgressPercent{

  font-size: 9pt;

  color: #000000;

  height: 15px;

  position: absolute;

  z-index: 20;

  width: 100%;





伊图教程网[www.etoow.com]

http://www.etoow.com/html/2007-12/1198302331-6.html

  text-align: center;

}

.ProgressBar{

 background-color:#91D65C;

  width:1px;

  height:15px;

}

</style>

<div id="Progress" style="display:none;" class="progress">

  <div class="bar">

    <div id="ProgressPercent" class="ProgressPercent">0%</div>

    <div id="ProgressBar" class="ProgressBar"></div>

  </div>

  <table border="0" cellspacing="0" cellpadding="2">

    <tr>

      <td>已经上传</td>

      <td>:</td>

      <td id="uploadSize"></td>

    </tr>

    <tr>

      <td>上传速度</td>

      <td>:</td>

      <td id="uploadSpeed">&nbsp;</td>

    </tr>

    <tr>

      <td>共需时间</td>

      <td>:</td>

      <td id="totalTime">&nbsp;</td>

    </tr>

    <tr>

      <td>剩余时间</td>

      <td>:</td>

      <td id="leftTime">&nbsp;</td>

    </tr>

  </table>

</div>

·上一篇:关于ASP代码与页面的分离 >>    ·下一篇:常用Response对象的使用详解 >>
推荐文章
最新文章