Exemplo.asp
< %@LANGUAGE="VBSCRIPT " CODEPAGE="65001"%>
<!--#include file="SundyUpload.asp"-->
<%
'A codificação do documento deste exemplo é UTF-8. Se for outro sistema de codificação, converta a codificação para a codificação correspondente, caso contrário os dados obtidos pelo formulário podem ficar distorcidos.
Dim objUpload,optar
DimxmlPath
Dim fileFormName,objFile,contador
opt = request.QueryString("opt")
Se opt = "Upload" Então
xmlPath = Server.MapPath(request.QueryString("xmlPath"))'Converter caminho virtual em caminho real
Set objUpload=new SundyUpload 'Crie um objeto de upload
objUpload.UploadInit xmlPath,"utf-8"
contador=1
Response.Write("Formulário normal:" & objUpload.Form("normalForm") & "<BR><BR>")'Obter dados do formulário
Para cada fileFormName em objUpload.objFile
Definir objFile=objUpload.objFile(fileFormName)
tamanho do arquivo = objArquivo.FileSize
strTemp = objFile.FilePath
Resposta.Write strTemp
nomeArquivo = mid(strTemp,InStrRev(strTemp, "")+1)
Se fileSize > 0 Então
Response.Write("Tamanho do arquivo:" & fileSize & "<BR>")
Response.Write("Nome do arquivo:" & objFile.FilePath & "<BR>")
' Response.Write("Descrição do arquivo:" & objUpload.Form("fileDesc" & contador) & "<BR><BR>")
objFile.SaveAs Server.MapPath(".") & "upload" & fileName
Response.Write "Salvar em: "&Server.MapPath(".") & "upload" & fileName & "<br><br>"
Terminar se
contador = contador + 1
Próximo
Terminar se
'Carregar arquivo de dados da barra de progresso (especificar caminho virtual para arquivo XML)
'É melhor ser aleatório, porque várias pessoas podem fazer upload ao mesmo tempo e exigir dados de progresso diferentes
'Este caminho precisa ser passado para o componente de upload durante o envio para que os dados de progresso possam ser alterados durante o processo de upload
'O cliente usa Javascript para ler este arquivo XML e exibir o progresso
xmlPath = "upload/" & Temporizador & ".xml"
%>
<html>
<cabeça>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Exemplo de barra de progresso de upload do Sundy</title>
<linguagem script="javascript">
funçãochkFrm(){
var objFrm = document.frmUpload;
if (objFrm.file1.value=="" && objFrm.file2.value==""){
alert("Selecione um arquivo");
objFrm.file1.focus();
retornar falso;
}
objFrm.action = "Exemplo.asp?opt=Upload&xmlPath=<%=xmlPath%>";
startProgress('<%=xmlPath%>'); // Inicia a barra de progresso
retornar verdadeiro;
}
</script>
</head>
<corpo>
<form name="frmUpload" method="post" action="Example.asp" enctype="multipart/form-data" onSubmit="return chkFrm()">
Formato normal:<BR><input type="text" name="normalForm" size="40"><BR><BR>
Arquivo 1:<BR>
<input type="arquivo" nome="arquivo1" tamanho="40"></br>
<input type="text" name="fileDesc1" size="30"><BR><BR>
Arquivo 2:<BR>
<input type="arquivo" nome="arquivo2" tamanho="40"></br>
<input type="text" name="fileDesc2" size="30"><BR>
Arquivo 3:<BR>
<input type="arquivo" nome="arquivo3" tamanho="40"></br>
Arquivo 4:<BR>
<input type="file" name="file4" size="40"></br>
Arquivo 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" />
<%
DimSundyUpload_SourceData
ClassSundyUpload
Dim objForm,objFile,Versão,objProgress
Dim xmlPath,CharsetEncoding
Formulário de função pública (strForm)
strForm=lcase(strForm)
Se NÃO objForm.exists(strForm) Então
Formulário=""
Outro
Formulário=objForm(strForm)
Terminar se
Arquivo de função pública
de função final
(strFile)
strArquivo=lcase(strArquivo)
Se NÃO objFile.exists(strFile) Então
Definir Arquivo = novo FileInfo
Outro
Definir Arquivo=objArquivo(strArquivo)
Terminar se
Função final
Public Sub UploadInit(progressXmlPath,charset)
Dim RequestData,sStart,Crlf,sInfo,iInfoStart,iInfoEnd,tStream,iStart,theFile
Dim iFileSize,sFilePath,sFileType,sFormValue,sFileName
Escureça iFindStart,iFindEnd
Dim iFormStart,iFormEnd,sFormName
Versão = "Barra de progresso de largura de upload versão 1.0"
Definir objForm=Server.CreateObject("Scripting.Dictionary")
Definir objFile=Server.CreateObject("Scripting.Dictionary")
Se Request.TotalBytes<1, então saia do Sub
Definir tStream = Server.CreateObject("adodb.stream")
Definir SundyUpload_SourceData = Server.CreateObject("adodb.stream")
SundyUpload_SourceData.Type = 1
SundyUpload_SourceData.Mode =3
SundyUpload_SourceData.Open
DimTotalBytes
Dim ChunkReadSize
Dim DataPart, PartSize
Dim objProgress
TotalBytes = Request.TotalBytes 'Tamanho total
ChunkReadSize = 64 * 1024 ' Tamanho do pedaço 64K
BytesLeitura = 0
xmlPath = progressXmlPath
CharsetEncoding = conjunto de caracteres
Se CharsetEncoding = "" Então
CharsetEncoding = "utf-8"
Terminar se
Definir objProgress = Novo Progresso
objProgress.ProgressInit(xmlPath)
objProgress.UpdateProgress Totalbytes,0
'Leitura do bloco em loop
Faça enquanto BytesRead <TotalBytes
'Leia em pedaços
PartSize = ChunkReadSize
Se PartSize + BytesRead > TotalBytes Então PartSize = TotalBytes - BytesRead
DataPart = Request.BinaryRead(PartSize)
BytesRead = BytesRead + PartSize
SundyUpload_SourceData.Write DataPart
objProgress.UpdateProgress Totalbytes,BytesLeitura
Laço
'SundyUpload_SourceData.Write Request.BinaryRead(Request.TotalBytes)
SundyUpload_SourceData.Position=0
RequestData=SundyUpload_SourceData.Read
iFormStart=1
iFormEnd = LenB(RequestData)
Crlf = chrB(13) e chrB(10)
sStart = MidB(RequestData,1, InStrB(iFormStart,RequestData,Crlf)-1)
iInício = LenB(sInício)
iFormStart=iFormStart+iStart+1
Enquanto (iFormStart + 10) <iFormEnd
iInfoEnd = InStrB(iFormStart,RequestData,Crlf & Crlf)+3
tStream.Type = 1
tStream.Modo =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.Fechar
'Obtém o nome do item do formulário
iFormStart = InStrB(iInfoEnd,RequestData,sStart)
iFindStart = InStr(22,sInfo,"nome=""",1)+6
iFindEnd = InStr(iFindStart,sInfo,"""",1)
sFormName = lcase(Mid (sinfo,iFindStart,iFindEnd-iFindStart))
'Se for um arquivo
Se InStr (45,sInfo,"filename=""",1) > 0 Então
Defina theFile=new FileInfo
'Pegue o nome do arquivo
iFindStart = InStr(iFindEnd,sInfo,"nome do arquivo=""",1)+10
iFindEnd = InStr(iFindStart,sInfo,"""",1)
sFileName = Mid (sinfo,iFindStart,iFindEnd-iFindStart)
theFile.FileName=getFileName(sFileName)
theFile.FilePath=getFilePath(sNomedoArquivo)
'Obtém o tipo de arquivo
iFindStart = InStr(iFindEnd,sInfo,"Tipo de conteúdo: ",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
Se NÃO objFile.Exists(sFormName) Então
objArquivo.add sFormName,oArquivo
Terminar se
Outro
'Se for um item de formulário
tStream.Type =1
tStream.Modo =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.Fechar
Se objForm.Exists(sFormName) Então
objForm(sFormName)=objForm(sFormName)&", "&sFormValue
Outro
objForm.Adicionar sFormName,sFormValue
Terminar se
Terminar se
iFormStart=iFormStart+iStart+1
Wend
SolicitarDados=""
Definir tStream = Nada
Finalizar sub
Subclasse Privada_Initialize
Finalizar sub
Subclasse Privada_Terminate
Se Request.TotalBytes>0 Então
objForm.RemoveAll
objFile.RemoveAll
Definir objForm=Nada
Definir objFile=Nada
SundyUpload_SourceData.Fechar
Definir SundyUpload_SourceData = Nada
Terminar se
Definir objProgress = Nada
Definir objFso = Server.CreateObject("Scripting.FileSystemObject")
Se objFso.FileExists(xmlPath) Então
objFso.DeleteFile(xmlPath)
Terminar se
Definir objFso = Nada
Finalizar sub
Função privada GetFilePath (FullPath)
Se FullPath <> "" Então
GetFilePath = left(FullPath,InStrRev(FullPath, ""))
Outro
GetFilePath = ""
Terminar se
Função final
Função privada GetFileName (FullPath)
Se FullPath <> "" Então
GetNomeArquivo = mid(CaminhoFull,InStrRev(CaminhoFull, "")+1)
Outro
GetNomeArquivo = ""
Terminar se
Função final
Fim da classe
Classe FileInfo
Dim FormName,FileName,FilePath,FileSize,FileType,FileStart
Subclasse Privada_Initialize
NomeArquivo = ""
FilePath = ""
Tamanho do arquivo = 0
ArquivoIniciar= 0
NomeFormulário = ""
TipoArquivo = ""
Finalizar sub
Função pública SaveAs(FullPath)
Dim dr,ErrorChar,i
Salvar como = Verdadeiro
'Resposta.Write caminho completo & "........................<br>"
'NomeArquivo="ss.txt"
Se trim(fullpath)="" ou FileStart=0 ou fileName="" ou right(fullpath,1)="/" Então saia da função
'Resposta.Escreva "2........................<br>"
Definir dr=CreateObject("Adodb.Stream")
dr.Modo=3
dr.Tipo = 1
dr.Abrir
SundyUpload_SourceData.position=FileStart
SundyUpload_SourceData.copyto dr,FileSize
dr.SaveToFile FullPath,2
dr.Fechar
Definir dr=Nada
Salvar como=Falso
Função final
Fim
da aula Progresso
da aula
Dim objDom,xmlPath
Dim startTime
Subclasse Privada_Initialize
End Sub
Sub ProgressInit público (xmlPathTmp)
Dim objRoot,objChild
Dim objPI
xmlPath = xmlPathTmp
Definir objDom = Server.CreateObject("Microsoft.XMLDOM")
Definir objRoot = objDom.createElement("progresso")
objDom.appendChild objRoot
Definir objChild = objDom.createElement("totalbytes")
objChild.Text = "0"
objRoot.appendChild
Definir objChild = objDom.createElement("uploadbytes")
objChild.Text = "0"
objRoot.appendChild
Definir objChild = objDom.createElement("uploadpercent")
objChild.Text = "0%"
objRoot.appendChild
Definir objChild = objDom.createElement("uploadspeed")
objChild.Text = "0"
objRoot.appendChild
Definir objChild = objDom.createElement("totaltime")
objChild.Text = "00:00:00"
objRoot.appendChild
Definir objChild = objDom.createElement("lefttime")
objChild.Text = "00:00:00"
objRoot.appendChild
Definir objPI = objDom.createProcessingInstruction("xml","version='1.0' encoding='utf-8'")
objDom.insertBefore objPI, objDom.childNodes(0)
objDom.Save xmlPath
Definir objPI = Nada
Definir objChild = Nada
Definir objRoot = Nada
Definir objDom = Nada
Finalizar sub
Sub AtualizaçãoProgress(tBytes,rBytes)
Dim eTime, currentTime, velocidade, totalTime, leftTime, porcentagem
Se rBytes = 0 Então
startTime = Temporizador
Definir objDom = Server.CreateObject("Microsoft.XMLDOM")
objDom.load(xmlPath)
objDom.selectsinglenode("//totalbytes").text=tBytes
objDom.save(xmlPath)
Outro
velocidade = 0,0001
currentTime = Temporizador
eTime = currentTime - startTime
Se eTime>0 Então velocidade = rBytes / eTime
totalTime = tBytes/velocidade
leftTime = (tBytes - rBytes) / velocidade
porcentagem = Rodada (rBytes *100 / tBytes)
'objDom.selectsinglenode("//uploadbytes").text = rBytes
'objDom.selectsinglenode("//uploadspeed").text = velocidade
'objDom.selectsinglenode("//totaltime").text = totalTime
'objDom.selectsinglenode("//hora esquerda").text = horaesquerda
objDom.selectsinglenode("//uploadbytes").text = FormatFileSize(rBytes) & " / " & FormatFileSize(tBytes)
objDom.selectsinglenode("//uploadpercent").text = porcentagem
objDom.selectsinglenode("//uploadspeed").text = FormatFileSize(velocidade) & "/seg"
objDom.selectsinglenode("//totaltime").text = SecToTime(totalTime)
objDom.selectsinglenode("//hora esquerda").text = SecToTime(horaesquerda)
objDom.save(xmlPath)
Terminar se
Fim Sub
função privada SecToTime (seg)
Dim h:h = "0"
Dim m:m = "0"
Dim s:s = "0"
h = rodada (seg/3600)
m = redondo ((seg mod 3600) / 60)
s = rodada (seg mod 60)
Se LEN(h)=1 Então h = "0" & h
Se LEN(m)=1 Então m = "0" & m
Se LEN(s)=1 Então s = "0" & s
SecToTime = (h & ":" & m & ":" & s)
Função final
Função privada FormatFileSize (fsize)
Rádio escuro,k,m,g,unidadeTMP
k = 1024
m = 1024*1024
g = 1024*1024*1024
rádio=1
Se Fix(fsize / g) > 0,0 Então
unidadeTMP = "GB"
rádio=g
ElseIf Fix(fsize / m) > 0 Então
unidadeTMP = "MB"
rádio=m
ElseIf Fix(fsize / k) > 0 Então
unidadeTMP = "KB"
rádio=k
Outro
unidadeTMP = "B"
rádio=1
Terminar se
Se rádio = 1 Então
FormatFileSize = fsize & " " & unitTMP
Outro
FormatFileSize = FormatNumber(fsize/radio,3) & unitTMP
Terminar se
Função final
Subclasse privada_Terminate
Definir objDom = Nada
Finalizar sub
Fim da aula
'http://www.knowsky.com/
%>
<linguagem script="javascript">
//Inicia a barra de progresso
função startProgress(xmlPath){
displayProgress();
setProgressDivPos();
setTimeout("DisplayProgressBar('" + xmlPath + "')",500);
}
função DisplayProgressBar(xmlPath){
var xmlDoc = novo ActiveXObject("Msxml2.DOMDocument.3.0");
xmlDoc.async = falso;
xmlDoc.load(xmlPath);
if (xmlDoc.parseError.errorCode!=0){
var erro = xmlDoc.parseError;
alerta(erro.motivo)
setTimeout("DisplayProgressBar('" + xmlPath + "')",1000);
retornar;
}
var root = xmlDoc.documentElement; //Nó raiz
var totalbytes = root.childNodes(0).text;
var uploadbytes = root.childNodes(1).text;
var porcentagem = root.childNodes(2).text;
ProgressPercent.innerHTML = porcentagem + "%";
ProgressBar.style.width = porcentagem + "%";
uploadSize.innerHTML = uploadbytes;
uploadSpeed.innerHTML = root.childNodes(3).text;
totalTime.innerHTML = root.childNodes(4).text;
leftTime.innerHTML = root.childNodes(5).text;
se (porcentagem<100){
setTimeout("DisplayProgressBar('" + xmlPath + "')",1000);
}
}
função displayProgress(){
var objProgress = document.getElementById("Progresso");
objProgress.style.display = "";
}
função fecharProgress(){
var objProgress = document.getElementById("Progresso");
objProgress.style.display = "nenhum";
}
função setProgressDivPos(){
var objProgress = document.getElementById("Progresso");
objProgress.style.top = document.body.scrollTop+(document.body.clientHeight-document.getElementById("Progresso").offsetHeight)/2
objProgress.style.left = document.body.scrollLeft+(document.body.clientWidth-document.getElementById("Progresso").offsetWidth)/2;
}
</script>
<style type="texto/css">
.progresso {
posição: absoluta;
preenchimento: 4px;
topo: 50;
esquerda: 400;
família de fontes: Verdana, Helvetica, Arial, sans-serif;
tamanho da fonte: 12px;
largura: 250px;
altura:100px;
plano de fundo: #FFFFD1;
cor: #3D2C05;
borda: 1px sólido #715208;
/* Proprietário da Mozilla */
-moz-border-radius: 5px;
/*-moz-opacidade: 0,95;
}
.tabela de progresso,.progress td{
tamanho da fonte: 9pt;
}
.Bar{
largura:100%;
altura:15px;
cor de fundo:#CCCCCC;
borda: inserção de 1px #666666;
margem inferior:4px;
}
.ProgressPercent{
tamanho da fonte: 9pt;
cor: #000000;
altura: 15px;
posição: absoluta;
índice z: 20;
largura: 100%;
alinhamento de texto: centro;
}
.ProgressBar{
cor de fundo:#91D65C;
largura:1px;
altura:15px;
}
</estilo>
<div id="Progresso" style="display:none;" class="progresso">
<div class="barra">
<div id="ProgressPercent" class="ProgressPercent">0%</div>
<div id="ProgressBar" class="ProgressBar"></div>
</div>
<table border="0" cellpacing="0" cellpadding="2">
<tr>
<td>Enviado</td>
<td>:</td>
<td id="uploadSize"></td>
</tr>
<tr>
<td>Velocidade de upload</td>
<td>:</td>
<td id="uploadSpeed"> </td>
</tr>
<tr>
<td>Tempo total necessário</td>
<td>:</td>
<td id="totalTime"> </td>
</tr>
<tr>
<td>Tempo restante</td>
<td>:</td>
<td id="leftTime"> </td>
</tr>
</tabela>
</div>
http://blog.csdn.net/delinsql/archive/2006/12/29/1467430.aspx