SWFUpload アップロード コンポーネントは、もともと Vinterwebb.se によって開発されました。このコンポーネントの本体は、主に、複数のファイルや大きなファイルのアップロードの問題を解決することに特化しています。 Web 開発者が簡単に呼び出すことができるように、js と css を通じてスタイルを簡単に制御し、目的のアップロード効果を実現できます。しかし、ASP が Web 開発から徐々に消えていくにつれて、公式は .net や php などのバージョンのアップロード処理プログラムのみを提供しているため、ASP 開発者はサーバー側でのデータ受信を自分で処理する必要があります。
私がこのコンポーネントに初めて触れたとき、その強力な機能、柔軟性、利便性に惹かれました。当時このプロジェクトは ASP を使用して開発されていたため、Baidu には有用な ASP アップロード処理プログラムが存在しないことがわかりました。たくさんあるので、自分でやるしかないと思っていました。研究開発当初は、ファイルデータを傍受するために通常の方法を使用していましたが、いくつかのテストを行った結果、効果的に受信できないことが判明しました。コンポーネントによって渡されるファイル データ。仕方なく、送信されたデータ形式の分析を開始しました。分析の結果、送信されたデータ形式が通常のアップロードとは多少異なることがわかりました。データのフォーマットは理解できたので、残りはそれを必要とする友人に処理方法を共有します。処理速度は非常に理想的です。
次のようにコードをコピーします。
<%
クラスSWUpload
プライベート formData、folderPath、streamGet
プライベートファイルサイズ、チャンクサイズ、bofCont、eofCont
REM クラスの初期化
プライベートサブクラス_初期化
CallInitVariant
Server.ScriptTimeOut = 1800
streamGet = Server.CreateObject(ADODB.Stream) を設定します。
s著者 = 51JS.COM-ZMM
sVersion = クラス 1.0 をアップロード
エンドサブ
REM クラスの初期化
Public プロパティ Let SaveFolder(byVal sFolder)
If Right(sFolder, 1) = / then
フォルダーパス = sフォルダー
それ以外
フォルダパス = sFolder & /
終了の場合
終了プロパティ
Public プロパティ Get SaveFolder
SaveFolder = フォルダーパス
終了プロパティ
プライベート関数 InitVariant
チャンクサイズ = 1024 * 128
フォルダーパス = / : ファイルサイズ = 1024 * 10
bofCont = StrToByte(オクテットストリーム & vbCrlf & vbCrlf)
eofCont = StrToByte(vbCrlf & String(12, -))
終了機能
パブリック関数 GetUploadData
ディム curRead : curRead = 0
Dim dataLen : dataLen = Request.TotalBytes
streamGet.Type = 1 : streamGet.Open
curRead < dataLen の間実行します
ディムpartLen :partLen = chunkSize
partLen + curRead > dataLen の場合、partLen = dataLen - curRead
streamGet.Write Request.BinaryRead(partLen)
curRead = curRead +partLen
ループ
streamGet.Position = 0
formData = streamGet.Read(dataLen)
GetUploadFile を呼び出す
終了機能
パブリック関数 GetUploadFile
Dim begMark : begMark = StrToByte(filename=)
Dim begPath : begPath = InStrB(1, formData, begMark & ChrB(34)) + 10
Dim endPath : endPath = InStrB(begPath, formData, ChrB(34))
Dim cntPath : cntPath = MidB(formData, begPath, endPath - begPath)
Dim cntName : cntName = フォルダーパス & GetClientName(cntPath)
Dim begFile : begFile = InStrB(1, formData, bofCont) + 15
Dim endFile : endFile = InStrB(begFile, formData, eofCont)
SaveUploadFile(cntName, begFile, endFile - begFile) を呼び出します。
終了機能
パブリック関数 SaveUploadFile(byVal fName、byVal bCont、byVal sLen)
Dim filePath : filePath = Server.MapPath(fName)
CreateFolder(|, GetParentFolder(filePath)) の場合
streamGet.Position = bCont
streamPut = Server.CreateObject(ADODB.Stream) を設定します。
streamPut.Type = 1 : streamPut.Mode = 3 : streamPut.Open
streamPut.Write streamGet.Read(sLen)
streamPut.SaveToFile ファイルパス、2
streamPut.Close : streamPut = なしを設定します
終了の場合
終了機能
プライベート関数 IsNothing(byVal sVar)
IsNothing = IsNull(sVar) または (sVar = 空)
終了機能
プライベート関数 StrToByte(byVal sText)
For i = 1 To Len(sText)
StrToByte = StrToByte & ChrB(Asc(Mid(sText, i, 1)))
次
終了機能
プライベート関数 ByteToStr(byVal sByte)
薄暗いストリーム温度
streamTmp = Server.CreateObject(ADODB.Stream) を設定します。
streamTmp.Type = 2
streamTmp.Mode = 3
streamTmp.Open
streamTmp.WriteText sByte
streamTmp.Position = 0
streamTmp.CharSet = utf-8
streamTmp.Position = 2
ByteToStr = streamTmp.ReadText
streamTmp.Close
streamTmp = なしを設定します
終了機能
プライベート関数 GetClientName(byVal bInfo)
Dim sInfo、正規表現
sInfo = ByteToStr(bInfo)
IsNothing(sInfo) の場合
GetClientName =
それ以外
正規表現 = 新しい正規表現を設定します
regEx.Pattern = ^.*//([^//]+)$
regEx.Global = False
regEx.IgnoreCase = True
GetClientName = regEx.Replace(sInfo, $1)
regEx = なしを設定します
終了の場合
終了機能
プライベート関数 GetParentFolder(byVal sPath)
ディム正規表現
正規表現 = 新しい正規表現を設定します
regEx.Pattern = ^(.*)//[^//]*$
regEx.Global = True
regEx.IgnoreCase = True
GetParentFolder = regEx.Replace(sPath, $1)
regEx = なしを設定します
終了機能
プライベート関数 CreateFolder(byVal sLine, byVal sPath)
fO
oFso = Server.CreateObject(Scripting.FileSystemObject) を設定します
oFso.FolderExists(sPath) がない場合
ディム正規表現
正規表現 = 新しい正規表現を設定します
regEx.Pattern = ^(.*)//([^//]*)$
regEx.Global = False
regEx.IgnoreCase = True
sLine = sLine & regEx.Replace(sPath, $2) & |
sPath = regEx.Replace(sPath, $1)
CreateFolder(sLine, sPath) の場合、CreateFolder = True
regEx = なしを設定します
それ以外
sLine = | の場合
CreateFolder = True
それ以外
Dim sTemp : sTemp = Mid(sLine, 2, Len(sLine) - 2)
InStrRev(sTemp, |) = 0 の場合
sライン = |
sPath = sPath & / & sTemp
それ以外
薄暗いフォルダー: フォルダー = Mid(sTemp, InStrRev(sTemp, |) + 1)
sLine = | & Mid(sTemp, 1, InStrRev(sTemp, |) - 1) & |
sPath = sPath & / & フォルダー
終了の場合
oFso.CreateFolder のパスパス
CreateFolder(sLine, sPath) の場合、CreateFolder = True
次の場合に終了
終了の場合
oFso = 何も設定しない
終了機能
REM クラス終了
プライベートサブクラス_Terminate
streamGet.Close
streamGet = なしを設定します
エンドサブ
終了クラス
REMコール方式
ディム・オ・アップロード
oUpload = 新しい SWFUpload を設定します
oUpload.SaveFolder = ストレージ パス
oUpload.GetUploadData
oアップロード = なしを設定します
%>