Пример.asp
< %@LANGUAGE="VBSCRIPT " CODEPAGE="65001"%>
<!--#include file="SundyUpload.asp"-->
<%
«Кодировка документа в этом примере — UTF-8. Если это другая система кодировки, преобразуйте кодировку в соответствующую, иначе данные, полученные с помощью формы, могут быть искажены.
Dim objUpload, выберите
ДимксмлПат
Dim fileFormName, objFile, счетчик
opt = request.QueryString("opt")
Если opt = «Загрузить» Тогда
xmlPath = Server.MapPath(request.QueryString("xmlPath"))'Преобразовать виртуальный путь в фактический путь
Set objUpload=new SundyUpload 'Создать объект загрузки
objUpload.UploadInit xmlPath, "utf-8"
счетчик=1
Response.Write("Обычная форма:" & objUpload.Form("normalForm") & "<BR><BR>")'Получить данные формы
Для каждого имени формы файла в objUpload.objFile
Установить objFile=objUpload.objFile(fileFormName)
fileSize = objFile.FileSize
strTemp= objFile.FilePath
Response.Write strTemp
имя_файла = Mid(strTemp,InStrRev(strTemp, "")+1)
Если размер файла > 0 Тогда
Response.Write("Размер файла:" & fileSize & "<BR>")
Response.Write("Имя файла:" & objFile.FilePath & "<BR>")
' Response.Write("Описание файла:" & objUpload.Form("fileDesc" & counter) & "<BR><BR>")
objFile.SaveAs Server.MapPath(".") & "upload" и имя_файла
Response.Write "Сохранить в: "&Server.MapPath(".") & "upload" & fileName & "<br><br>"
Конец, если
счетчик = счетчик + 1
Следующий
Конец, если
'Загрузить файл данных индикатора выполнения (указать виртуальный путь для XML-файла)
«Лучше всего выбирать случайным образом, потому что несколько человек могут загружать файлы одновременно и им требуются разные данные о ходе выполнения.
«Этот путь необходимо передать в компонент загрузки при отправке, чтобы данные о ходе выполнения можно было изменить во время процесса загрузки.
'Клиент использует Javascript для чтения этого XML-файла и отображения прогресса.
xmlPath = "upload/" и таймер и ".xml"
%>
<html>
<голова>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Пример индикатора выполнения загрузки Sundy</title>
<script Language="JavaScript">
функция chkFrm(){
вар objFrm = document.frmUpload;
if (objFrm.file1.value=="" && objFrm.file2.value==""){
alert("Пожалуйста, выберите файл");
objFrm.file1.focus();
вернуть ложь;
}
objFrm.action = "Example.asp?opt=Upload&xmlPath=<%=xmlPath%>";
startProgress('<%=xmlPath%>');//Запускаем индикатор выполнения
вернуть истину;
}
</скрипт>
</head>
<тело>
<form name="frmUpload" метод="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"/>
</форма>
</тело>
</html>
SundyUpload.asp
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<%
DimSundyUpload_SourceData
КлассSundyЗагрузить
Тусклый objForm, objFile, версия, objProgress
Тусклый xmlPath, CharsetEncoding
Форма публичной функции (strForm)
strForm=lcase(strForm)
Если НЕ objForm.exists(strForm) Тогда
Форма=""
Еще
Форма=objForm(strForm)
Конец, если
конечной функции
(strFile)
strFile=lcase(strFile)
Если НЕ objFile.exists(strFile) Тогда
Установить File=new FileInfo
Еще
Установить File=objFile(strFile)
Конец, если
Конечная функция
Public Sub UploadInit (progressXmlPath, кодировка)
Dim RequestData,sStart,Crlf,sInfo,iInfoStart,iInfoEnd,tStream,iStart,theFile
Dim iFileSize, sFilePath, sFileType, sFormValue, sFileName
Тусклый iFindStart, iFindEnd
Тусклый iFormStart, iFormEnd, sFormName
Version="Ширина загрузки, версия 1.0"
Set objForm=Server.CreateObject("Scripting.Dictionary")
Set objFile=Server.CreateObject("Scripting.Dictionary")
Если Request.TotalBytes<1, то выйти из Sub
Установите tStream = Server.CreateObject("adodb.stream")
Установите SundyUpload_SourceData = Server.CreateObject("adodb.stream")
SundyUpload_SourceData.Type = 1
SundyUpload_SourceData.Mode =3
SundyUpload_SourceData.Open
Димтоталбайтес
Тусклый кусокЧитатьРазмер
Dim DataPart, PartSize
Dim objПрогресс
TotalBytes = Request.TotalBytes 'Общий размер
ChunkReadSize = 64 * 1024 ' Размер чанка 64 КБ
БайтсЧтение = 0
xmlPath = прогрессXmlPath
CharsetEncoding = кодировка
Если CharsetEncoding = "" Тогда
CharsetEncoding = "utf-8"
Конец, если
Установите objProgress = Новый прогресс
objProgress.ProgressInit(xmlPath)
objProgress.UpdateProgress Всего байт, 0
'Цикл чтения блока
Делать, пока BytesRead < TotalBytes
«Читайте частями»
PartSize = ChunkReadSize
Если PartSize + BytesRead > TotalBytes Тогда PartSize = TotalBytes - BytesRead
DataPart = Request.BinaryRead(PartSize)
BytesRead = BytesRead + PartSize
SundyUpload_SourceData.Write DataPart
objProgress.UpdateProgress Всего байт, BytesRead
Петля
'SundyUpload_SourceData.Write Request.BinaryRead(Request.TotalBytes)
SundyUpload_SourceData.Position=0
RequestData =SundyUpload_SourceData.Read
iFormStart=1
iFormEnd = LenB (Данные запроса)
Crlf = chrB(13) и chrB(10)
sStart = MidB(RequestData,1, InStrB(iFormStart,RequestData,Crlf)-1)
iStart = LenB(sStart)
iFormStart=iFormStart+iStart+1
Пока (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))
'Если это файл
Если InStr (45,sInfo,"filename=""",1) > 0 Тогда
Установите 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
Если НЕ objFile.Exists(sFormName), Тогда
objFile.add имя_формы,файл
Конец, если
Еще
'Если это элемент формы
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 = Кодировка символов
sFormValue = tStream.ReadText
tStream.Close
Если objForm.Exists(sFormName) Тогда
objForm(sFormName)=objForm(sFormName)&", "&sFormValue
Еще
objForm.Добавить имя_формы,значение_формы
Конец, если
Конец, если
iFormStart=iFormStart+iStart+1
Венд
ЗапросДанные=""
Установить tStream = Ничего
Конец субтитра
Частный подкласс_инициализировать
Конец субтитра
Частный подкласс_Terminate
Если Запрос.TotalBytes>0 Тогда
objForm.RemoveAll
objFile.RemoveAll
Установить objForm=Ничего
Установить objFile=Ничего
SundyUpload_SourceData.Close
Установите SundyUpload_SourceData = Ничего
Конец, если
Установить objProgress = Ничего
Установите objFso = Server.CreateObject("Scripting.FileSystemObject")
Если objFso.FileExists(xmlPath) Тогда
objFso.DeleteFile(xmlPath)
Конец, если
Установить objFso = Ничего
Конец субтитра
Частная функция GetFilePath(FullPath)
Если FullPath <> "" Тогда
GetFilePath = left(FullPath,InStrRev(FullPath, ""))
Еще
GetFilePath = ""
Конец, если
Конечная функция
Частная функция GetFileName(FullPath)
Если FullPath <> "" Тогда
GetFileName = Mid(FullPath,InStrRev(FullPath, "")+1)
Еще
ПолучитьИмяФайла = ""
Конец, если
Конечная функция
Конец класса
Class FileInfo
Dim имя формы, имя файла, путь к файлу, размер файла, тип файла, начало файла
Частный подкласс_инициализировать
ИмяФайла = ""
Путь к Файлу = ""
РазмерФайла = 0
ФилеСтарт= 0
ИмяФормы = ""
ТипФайла = ""
Конец субтитра
Открытая функция SaveAs(FullPath)
Тусклый доктор,ErrorChar,я
СохранитьКак=Истина
'Response.Write полный путь & "........................<br>"
'FileName="ss.txt"
Если Trim(fullpath)="" или FileStart=0 или fileName="" или right(fullpath,1)="/" Тогда выйдите из функции
'Ответ. Напишите "2........................<br>"
Set dr=CreateObject("Adodb.Stream")
др.Режим=3
доктор.Тип=1
Dr.Open
SundyUpload_SourceData.position=FileStart
SundyUpload_SourceData.copyto dr,FileSize
dr.SaveToFile FullPath,2
Др.Закрыть
Установить др=Ничего
SaveAs=False
Конечная функция
Конец
класса Прогресс
класса
Тусклый объект objDom, xmlPath
Тусклое время начала
Частный подкласс_Initialize
End Sub
Публичный подпрогрессинит (xmlPathTmp)
Тусклый objRoot,objChild
Тусклый objPI
xmlPath = xmlPathTmp
Установите objDom = Server.CreateObject("Microsoft.XMLDOM")
Установите objRoot = objDom.createElement("прогресс")
objDom.appendChild objRoot
Установите objChild = objDom.createElement("totalbytes")
objChild.Text = "0"
objRoot.appendChild objChild
Установите objChild = objDom.createElement("uploadbytes")
objChild.Text = "0"
objRoot.appendChild objChild
Установите objChild = objDom.createElement("uploadpercent")
objChild.Text = "0%"
objRoot.appendChild objChild
Установите objChild = objDom.createElement("скорость загрузки")
objChild.Text = "0"
objRoot.appendChild objChild
Установите objChild = objDom.createElement("общее время")
objChild.Text = "00:00:00"
objRoot.appendChild objChild
Установите objChild = objDom.createElement("lefttime")
objChild.Text = "00:00:00"
objRoot.appendChild objChild
Установите objPI = objDom.createProcessingInstruction("xml","version='1.0'coding='utf-8'")
objDom.insertBefore objPI, objDom.childNodes(0)
objDom.Сохранить xmlPath
Установить objPI = Ничего
Установить objChild = Ничего
Установить objRoot = Ничего
Установить objDom = Ничего
Конец субтитра
Sub UpdateProgress (tBytes, rBytes)
Dim eTime, currentTime, скорость, totalTime, leftTime, процент
Если rBytes = 0 Тогда
startTime = Таймер
Установите objDom = Server.CreateObject("Microsoft.XMLDOM")
objDom.load(xmlPath)
objDom.selectsinglenode("//totalbytes").text=tBytes
objDom.save(xmlPath)
Еще
скорость = 0,0001
currentTime = Таймер
eTime = текущеевремя - время начала
Если eTime>0, то скорость = rBytes / eTime.
TotalTime = тбайт/скорость
leftTime = (tBytes - rBytes) / скорость
процент = Round(rBytes *100 / tBytes)
'objDom.selectsinglenode("//uploadbytes").text = rBytes
'objDom.selectsinglenode("//uploadspeed").text = скорость
'objDom.selectsinglenode("//totaltime").text = totalTime
'objDom.selectsinglenode("//lefttime").text = leftTime
objDom.selectsinglenode("//uploadbytes").text = FormatFileSize(rBytes) & " / " & FormatFileSize(tBytes)
objDom.selectsinglenode("//uploadpercent").text = процент
objDom.selectsinglenode("//uploadspeed").text = FormatFileSize(скорость) & "/sec"
objDom.selectsinglenode("//totaltime").text = SecToTime(totalTime)
objDom.selectsinglenode("//lefttime").text = SecToTime(leftTime)
objDom.save(xmlPath)
Конец, если
Завершить
частную функцию SecToTime(сек)
Тусклый ч:ч = "0"
Тусклый м:м = "0"
Тусклый с:с = "0"
h = раунд (сек / 3600)
m = раунд((сек мод 3600)/60)
s = раунд (с мод. 60)
Если LEN(h)=1, то h = "0" & h
Если LEN(m)=1, то m = «0» & m
Если LEN(s)=1 Тогда s = "0" & s
SecToTime = (ч & ":" & м & ":" & с)
Конечная функция
частная функция FormatFileSize(fsize)
Тусклый радио,k,m,g,единицаTMP
к = 1024
м = 1024*1024
г = 1024*1024*1024
радио=1
Если Fix(fsize/g) > 0,0 Тогда
unitTMP = "ГБ"
радио=г
ИначеЕсли Fix(fsize/m) > 0 Тогда
unitTMP = "МБ"
радио=м
ИначеЕсли Fix(fsize / k) > 0 Тогда
unitTMP = "КБ"
радио=к
Еще
unitTMP = "B"
радио=1
Конец, если
Если радио = 1 Тогда
FormatFileSize = fsize & " " & unitTMP
Еще
FormatFileSize = FormatNumber(fsize/radio,3) & unitTMP
Конец, если
Конечная функция
Private Sub Class_Terminate
Установить objDom = Ничего
Конец субтитра
Конечный класс
'http://www.knowsky.com/
%>
<script Language="JavaScript">
//Запускаем индикатор выполнения
функция startProgress(xmlPath){
дисплейПрогресс();
установитьПрогрессДивПос();
setTimeout("DisplayProgressBar('" + xmlPath + "')",500);
}
функция DisplayProgressBar(xmlPath){
вар xmlDoc = новый ActiveXObject("Msxml2.DOMDocument.3.0");
xmlDoc.async = ложь;
xmlDoc.load(xmlPath);
если (xmlDoc.parseError.errorCode!=0){
ошибка вар = xmlDoc.parseError;
предупреждение(ошибка.причина)
setTimeout("DisplayProgressBar('" + xmlPath + "')",1000);
возвращаться;
}
var root = xmlDoc.documentElement; //Корневой узел;
вар totalbytes = root.childNodes(0).text;
вар uploadbytes = root.childNodes(1).text;
вар процент = root.childNodes(2).text;
ProgressPercent.innerHTML = процент + «%»;
ProgressBar.style.width = процент + «%»;
uploadSize.innerHTML = uploadbytes;
uploadSpeed.innerHTML = root.childNodes(3).text;
totalTime.innerHTML = root.childNodes(4).text;
leftTime.innerHTML = root.childNodes(5).text;
если (проценты<100){
setTimeout("DisplayProgressBar('" + xmlPath + "')",1000);
}
}
функция displayProgress(){
var objProgress = document.getElementById("Прогресс");
objProgress.style.display = "";
}
функция closeProgress(){
var objProgress = document.getElementById("Прогресс");
objProgress.style.display = "нет";
}
функция setProgressDivPos(){
var objProgress = document.getElementById("Прогресс");
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;
}
</скрипт>
<style type="text/css">
.прогресс {
позиция: абсолютная;
отступ: 4 пикселя;
верх: 50;
слева: 400;
семейство шрифтов: Verdana, Helvetica, Arial, без засечек;
размер шрифта: 12 пикселей;
ширина: 250 пикселей;
высота: 100 пикселей;
фон: #FFFFD1;
цвет: #3D2C05;
граница: сплошная 1 пиксель #715208;
/* Собственность Mozilla */
-moz-border-radius: 5 пикселей;
/*-moz-непрозрачность: 0,95 */
}
.progress table,.progress td{
размер шрифта: 9pt;
}
.Бар{
ширина: 100%;
высота: 15 пикселей;
цвет фона:#CCCCCC;
граница: вставка размером 1 пиксель #666666;
поле-дно: 4 пикселя;
}
.ProgressPercent{
размер шрифта: 9pt;
цвет: #000000;
высота: 15 пикселей;
позиция: абсолютная;
z-индекс: 20;
ширина: 100%;
выравнивание текста: по центру;
}
.ProgressBar{
цвет фона: #91D65C;
ширина: 1 пиксель;
высота: 15 пикселей;
}
</стиль>
<div id="Прогресс" style="display:none;" class="progress">
<div класс="бар">
<div id="ProgressPercent" class="ProgressPercent">0%</div>
<div id="ProgressBar" class="ProgressBar"></div>
</div>
<table border="0" cellpacing="0" cellpadding="2">
<тр>
<td>Загружен</td>
<тд>:</тд>
<td id="uploadSize"></td>
</tr>
<тр>
<td>Скорость загрузки</td>
<тд>:</тд>
<td id="uploadSpeed"> </td>
</tr>
<тр>
<td>Общее необходимое время</td>
<тд>:</тд>
<td id="totalTime"> </td>
</tr>
<тр>
<td>Оставшееся время</td>
<тд>:</тд>
<td id="leftTime"> </td>
</tr>
</таблица>
</div>
http://blog.csdn.net/delinsql/archive/2006/12/29/1467430.aspx