ASP无组件上载,带进度条,多文件上载
作者:佚名 来源:12it.net 发布时间:2008-10-29 10:03:00
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 FunctionPublic 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 ClassClass 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 ClassClass Progress
Dim objDom,xmlPath
Dim startTime
Private Sub Class_InitializeEnd Sub
Public Sub ProgressInit(xmlPathTmp)
Dim objRoot,objChild
Dim objPIxmlPath = 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 Subprivate 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 & " " & unitTMP
Else
FormatFileSize = FormatNumber(fsize/radio,3) & unitTMP
End If
End FunctionPrivate Sub Class_Terminate
Set objDom = Nothing
End Sub
End Class
'http://www.knowsky.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"> </td>
</tr>
<tr>
<td>共需时间</td>
<td>:</td>
<td id="totalTime"> </td>
</tr>
<tr>
<td>剩余时间</td>
<td>:</td>
<td id="leftTime"> </td>
</tr>
</table>
</div>


猜你喜欢
- 首先来聊聊Vue框架,Vue是一套用于构建用户界面的渐进式的JavaScript框架,对于初学者来说是非常友好的 , Vue的虚拟Dom ,
- 本文实例讲述了mysql累积聚合原理与用法。分享给大家供大家参考,具体如下:累积聚合为聚合从序列内第一个元素到当前元素的数据,如为每个员工返
- 切片的长度,显而易见的就是元素的个数,根据元素的个数进行返回具体的长度。切片的长度,更像是一个警戒值,如果长度与容量相等,就会进行容量的扩容
- 在业务稳定性要求比较高的情况下,运维为能及时发现问题,有时需要对应用程序的日志进行实时分析,当符合某个条件时就立刻报警,而不是被动等待出问题
- 判断某一个表的记录总数,对于一个开发者来说是最再常见不过的事,我想大家都常用的作法就是:以下为引用的内容:select count(*) f
- __str__和__repr__的异同?字符串的表示形式我们都知道,Python的内置函数repr()能够把对象用字符串的形式表达出来,方便
- 前言简单介绍下python的几个自动求导工具,tangent、autograd、sympy;在各种机器学习、深度学习框架中都包含了自动微分,
- 本文实例讲述了Go语言使用HTTP包创建WEB服务器的方法。分享给大家供大家参考,具体如下:在Golang中写一个http web服务器大致
- 最近,Facebook设计团队在其位于加州帕罗奥多市(Palo Alto)的总部,提到了他们为2.5亿用户设计的原理和方法。 他们特别强调了
- SQL查询某字段的值为空sql中字段的默认有NULL和另一种空白的形式如何取查询这两种存在的记录呢?空白值查询:SELECT * FROM
- 前言Python可以操作Excel的模块不止一种,我习惯使用的写入模块是xlwt(一般都是读写模块分开的)python中使用xlwt操作ex
- 最近我因为要安装 Firebug 1.4 导致我不得不安装了 Firefox 3.5 ,所以很不小心地接触到了Wordpress后台那漂亮的
- mysql中用命令行复制表结构的方法主要有一下几种: 1.只复制表结构到新表CREATE TABLE 新表 SELECT * FR
- Javascript 中的闭包其实很改语言中很难理解的一部分。感谢 Stuart 提供了那么棒的 PPT,它深入浅出的解释了 Javascr
- 前言之前学习过node.js接触过express框架,最近为了编写一个mock server正好用到了express。下面正好就跟大家介绍一
- 一、适配器模式适配器,顾名思义是一种万能的接口,达到万能转换的效果。适配器模式,定义一个适配器类,并且在该类中定义了适配器接口,这些适配接口
- type PipeWritertype PipeWriter struct { // contains
- Tip:本文仅供学习与交流,切勿用于非法用途!!!背景介绍有个同学问我:“XXX,有没有办法搜集一下淘宝的商品信息啊,我想要做个统计”。于是
- 简介Elasticsearch 是一个分布式可扩展的实时搜索和分析引擎,一个建立在全文搜索引擎 Apache Lucene&trad
- 本文实例讲述了Python 类方法和实例方法(@classmethod),静态方法(@staticmethod)。分享给大家供大家参考,具体