加入收藏 | 设为首页 | 会员中心 | 我要投稿 驾考网 (https://www.jiakaowang.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > Asp教程 > 正文

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

发布时间:2023-10-10 13:15:58 所属栏目:Asp教程 来源:
导读:以下为引用的内容:Example.asp<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%><!--#include file="SundyUpload.asp"--><%&#39;此例子文档编码都是UTF-8,如果是其他编码的系统,请将编码转换为相应的编码,不然表单获取数

以下为引用的内容: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

 

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

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

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

'http://www.CuoXIn.com/

%>

<script language="javascript">

//启动进度条

function startProgress(xmlPath){

displayProgress();

setProgressDivPos();

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

}

function DisplayProgressBar(xmlPath){

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%;

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>

(编辑:驾考网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章