Example.asp
< %@LANGUAGE="VBSCRIPT " CODEPAGE="65001"%>
<!--#include file="SundyUpload.asp"-->
<%
'この例の文書エンコーディングは UTF-8 です。他のエンコーディングである場合は、対応するエンコーディングに変換してください。そうしないと、フォームで取得されたデータが文字化けする可能性があります。
Dim objUpload、opt
DimxmlPath
Dim ファイルフォーム名、objファイル、カウンター
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("通常フォーム") & "<BR><BR>")'フォームデータの取得
objUpload.objFile の各ファイルのフォーム名
objFile=objUpload.objFile(ファイルフォーム名) を設定します。
ファイルサイズ = objFile.FileSize
strTemp= objFile.FilePath
Response.Write strTemp
ファイル名 = Mid(strTemp,InStrRev(strTemp, "")+1)
fileSize > 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>
<スクリプト言語="javascript">
関数 chkFrm(){
var objFrm = document.frmUpload;
if (objFrm.file1.value=="" && objFrm.file2.value==""){
alert("ファイルを選択してください");
objFrm.file1.focus();
false を返します。
}
objFrm.action = "Example.asp?opt=Upload&xmlPath=<%=xmlPath%>";
startProgress('<%=xmlPath%>');//進行状況バーを開始します
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" />
<%
DimSundyUpload_SourceData
クラスSundyアップロード
Dim objForm、objFile、Version、objProgress
Dim xmlPath、CharsetEncoding
パブリック関数フォーム(strForm)
strForm=lcase(strForm)
objForm.exists(strForm) ではない場合
フォーム=""
それ以外
フォーム=objForm(strForm)
終了の場合
終了関数
パブリック関数ファイル(strFile)
strFile=lcase(strFile)
objFile.exists(strFile) ではない場合
File=new FileInfo を設定します
それ以外
ファイル=objFile(strFile) を設定します。
終了の場合
終了機能
Public Sub UploadInit(progressXmlPath,charset)
Dim RequestData、sStart、Crlf、sInfo、iInfoStart、iInfoEnd、tStream、iStart、theFile
Dim iFileSize、sFilePath、sFileType、sFormValue、sFileName
薄暗い iFindStart、iFindEnd
Dim 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") を設定します。
Set SundyUpload_SourceData = Server.CreateObject("adodb.stream")
SundyUpload_SourceData.Type = 1
SundyUpload_SourceData.Mode =3
SundyUpload_SourceData.Open
DimTotalBytes
ディムチャンク読み取りサイズ
Dim DataPart、PartSize
薄暗いオブジェクトの進行状況
TotalBytes = Request.TotalBytes '合計サイズ
ChunkReadSize = 64 * 1024 ' チャンク サイズ 64K
バイト読み取り = 0
xmlPath = progressXmlPath
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 Totalbytes,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
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))
'ファイルの場合
InStr (45,sInfo,"filename=""",1) > 0 の場合
File=new FileInfo を設定します
'ファイル名を取得する
iFindStart = InStr(iFindEnd,sInfo,"ファイル名=""",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,"コンテンツ タイプ: ",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 sFormName、ファイル
終了の場合
それ以外
'フォーム項目の場合
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
objForm.Exists(sFormName) の場合
objForm(sFormName)=objForm(sFormName)&", "&sFormValue
それ以外
objForm.Add sFormName,sFormValue
終了の場合
終了の場合
iFormStart=iFormStart+iStart+1
ウェン
リクエストデータ=""
tStream = なしを設定します
エンドサブ
プライベートサブクラス_初期化
エンドサブ
プライベートサブクラス_Terminate
Request.TotalBytes>0 の場合
objForm.RemoveAll
objFile.RemoveAll
objForm=Nothing を設定します
objFile=Nothing を設定します
SundyUpload_SourceData.Close
SundyUpload_SourceData = なしを設定します
終了の場合
objProgress = なしを設定します
Set objFso = Server.CreateObject("Scripting.FileSystemObject")
objFso.FileExists(xmlPath) の場合
objFso.DeleteFile(xmlPath)
終了の場合
objFso = なしを設定します
エンドサブ
プライベート関数 GetFilePath(FullPath)
フルパス <> "" の場合
GetFilePath = left(FullPath,InStrRev(FullPath, ""))
それ以外
GetFilePath = ""
終了の場合
終了機能
プライベート関数 GetFileName(FullPath)
フルパス <> "" の場合
GetFileName = Mid(FullPath,InStrRev(FullPath, "")+1)
それ以外
GetFileName = ""
終了の場合
終了機能
終了クラス
クラス FileInfo
Dim フォーム名、ファイル名、ファイルパス、ファイルサイズ、ファイルタイプ、ファイル開始
プライベートサブクラス_初期化
ファイル名 = ""
ファイルパス = ""
ファイルサイズ = 0
ファイル開始= 0
フォーム名 = ""
ファイルタイプ = ""
エンドサブ
パブリック関数 SaveAs(フルパス)
Dim dr、ErrorChar、i
名前を付けて保存=True
'応答。フルパスを書き込みます & "......................................<br>"
'ファイル名 = "ss.txt"
Trim(fullpath)="" または FileStart=0 または fileName="" または right(fullpath,1)="/" の場合、関数を終了します
'応答。「2......................................<br>」と書いてください。
dr=CreateObject("Adodb.Stream") を設定します。
博士モード=3
dr.Type=1
ドクターオープン
SundyUpload_SourceData.position=ファイル開始
SundyUpload_SourceData.copyto dr,FileSize
dr.SaveToFile フルパス、2
ドクタークローズ
dr=何も設定しない
名前を付けて保存=False
終了機能
クラス終了
クラスの進行状況
Dim objDom,xmlPath
ディムスタートタイム
Private Sub Class_Initialize
End Sub
Public Sub ProgressInit(xmlPathTmp)
Dim objRoot、objChild
Dim objPI
xmlPath = xmlPathTmp
Set objDom = Server.CreateObject("Microsoft.XMLDOM")
objRoot = objDom.createElement("進行状況") を設定します。
objDom.appendChild objRoot
objChild = objDom.createElement("合計バイト数") を設定します
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
Set objPI = objDom.createProcessingstruct("xml","version='1.0'coding='utf-8'")
objDom.insertobjPI の前、objDom.childNodes(0)
objDom.Save xmlPath
objPI = なしを設定します
objChild = なしを設定します
objRoot = なしを設定します
objDom = なしを設定します
エンドサブ
サブ更新進行状況(tBytes,rBytes)
Dim eTime、現在の時間、速度、合計時間、残り時間、パーセント
rBytes = 0 の場合
startTime = タイマー
Set objDom = Server.CreateObject("Microsoft.XMLDOM")
objDom.load(xmlPath)
objDom.selectsinglenode("//totalbytes").text=tBytes
objDom.save(xmlPath)
それ以外
速度 = 0.0001
現在の時間 = タイマー
eTime = 現在時刻 - 開始時刻
eTime>0 の場合、速度 = rBytes / eTime
totalTime = tバイト/速度
leftTime = (tBytes - rBytes) / 速度
パーセント = 四捨五入(rバイト *100 / tバイト)
'objDom.selectsinglenode("//uploadbytes").text = rBytes
'objDom.selectsinglenode("//uploadspeed").text = 速度
'objDom.selectsinglenode("//合計時間").text = 合計時間
'objDom.selectsinglenode("//lefttime").text = leftTime
objDom.selectsinglenode("//uploadbytes").text = FormatFileSize(rBytes) & " / " & FormatFileSize(tBytes)
objDom.selectsinglenode("//uploadpercent").text = パーセント
objDom.selectsinglenode("//uploadspeed").text = FormatFileSize(speed) & "/sec"
objDom.selectsinglenode("//totaltime").text = SecToTime(totalTime)
objDom.selectsinglenode("//lefttime").text = SecToTime(leftTime)
objDom.save(xmlPath)
終了の場合
End Sub
プライベート関数 SecToTime(秒)
ディム h:h = "0"
ディム m:m = "0"
ディム s:s = "0"
h = ラウンド(秒 / 3600)
m = ラウンド( (秒 mod 3600) / 60)
s = ラウンド(秒 mod 60)
LEN(h)=1 の場合 h = "0" & h
LEN(m)=1 の場合、m = "0" & m
LEN(s)=1 の場合、s = "0" & s
SecToTime = (h & ":" & m & ":" & s)
終了機能
private 関数 FormatFileSize(fsize)
ディムラジオ、k、m、g、unitTMP
k = 1024
m = 1024*1024
g = 1024*1024*1024
ラジオ=1
Fix(fsize / g) > 0.0 の場合
単位TMP = "GB"
ラジオ=g
ElseIf Fix(fsize / m) > 0 then
単位TMP = "MB"
ラジオ=メートル
ElseIf Fix(fsize / k) > 0 then
単位TMP = "KB"
ラジオ=k
それ以外
ユニットTMP = "B"
ラジオ=1
終了の場合
ラジオ = 1 の場合
FormatFileSize = fsize & " "
それ以外
FormatFileSize = FormatNumber(fsize/radio,3) & ユニットTMP
終了の場合
終了関数
プライベートサブクラス_Terminate
objDom = なしを設定します
エンドサブ
終了クラス
「http://www.knowsky.com/」
%>
<スクリプト言語="javascript">
// プログレスバーを開始
関数 startProgress(xmlPath){
表示進捗();
setProgressDivPos();
setTimeout("DisplayProgressBar('" + xmlPath + "')",500);
関数 DisplayProgressBar(xmlPath)
{
var xmlDoc = new ActiveXObject("Msxml2.DOMDocument.3.0");
xmlDoc.async = false;
xmlDoc.load(xmlPath);
if (xmlDoc.parseError.errorCode!=0){
var エラー = xmlDoc.parseError;
アラート(エラー.理由)
setTimeout("DisplayProgressBar('" + xmlPath + "')",1000);
戻る;
}
var root = xmlDoc.documentElement; //ルートノード
var totalbytes = root.childNodes(0).text;
var Uploadbytes = root.childNodes(1).text;
var パーセント = root.childNodes(2).text;
ProgressPercent.innerHTML = パーセント + "%";
ProgressBar.style.width = パーセント + "%";
UploadSize.innerHTML = アップロードバイト;
UploadSpeed.innerHTML = root.childNodes(3).text;
totalTime.innerHTML = root.childNodes(4).text;
leftTime.innerHTML = root.childNodes(5).text;
if (パーセント<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;
}
</script>
<style type="text/css">
。進捗 {
位置: 絶対;
パディング: 4px;
トップ: 50;
左: 400;
フォントファミリー: Verdana、Helvetica、Arial、サンセリフ;
フォントサイズ: 12px;
幅: 250ピクセル;
高さ:100ピクセル;
背景: #FFFFD1;
色: #3D2C05;
境界線: 1px ソリッド #715208;
/* Mozilla 独自仕様 */
-moz-border-radius: 5px;
/*-moz-不透明度: 0.95;
}
.progress テーブル、.progress td{
フォントサイズ:9pt;
}
。バー{
幅:100%;
高さ:15ピクセル;
背景色:#CCCCCC;
境界線: 1px インセット #666666;
マージンボトム:4px;
.ProgressPercent
{
フォントサイズ: 9pt;
色: #000000;
高さ: 15px;
位置: 絶対;
z インデックス: 20;
幅: 100%;
テキスト整列: 中央;
}
.ProgressBar{
背景色:#91D65C;
幅:1ピクセル;
高さ:15ピクセル;
}
</スタイル>
<div id="進捗" style="display:none;" class="進捗">
<div class="bar">
<div id="ProgressPercent" class="ProgressPercent">0%</div>
<div id="ProgressBar" class="ProgressBar"></div>
</div>
<table border="0" cellpacing="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>
</テーブル>
</div>
http://blog.csdn.net/delinsql/archive/2006/12/29/1467430.aspx