分享
 
 
 

[原创]ASP无组件上载,带进度条,多文件上载。。

王朝asp·作者佚名  2006-12-12
窄屏简体版  字體: |||超大  

各种ASP无组件上载,带进度条的实在太多,用起来也不方便,今天自己写了一个,希望大家给点意见

页面都是UTF-8 编码的,用的时候可根据自己页面编码转换

核心编码:SundyUpload.asp

例子:Example.asp

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

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

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

%>

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

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

fileName = objFile.FileName

If fileSize > 0 Then

Response.Write("File Size:" & fileSize & "<BR>")

Response.Write("File Name:" & objFile.FilePath & fileName & "<BR>")

Response.Write("File Description:" & objUpload.Form("fileDesc" & counter) & "<BR><BR>")

'objFile.SaveAs 文件的实际路径(可以自行处理)

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>

<input type="submit" name="btnSubmit" value="submit"/>

</form>

</body>

</html>

将以上代码存为相应的文件,记得这个例子的页面编码一定要是UTF-8的,以后需要自己可以改。

进度条图示(本地上载):

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有