คอมโพเนนต์การอัปโหลด SWFUpload ได้รับการพัฒนาโดย Vinterwebb.se ส่วนเนื้อหาหลักของคอมโพเนนต์นี้รวมเข้ากับ Flash และ JavaScript เป็นหลัก โดยเน้นไปที่การแก้ปัญหาการอัปโหลดหลายไฟล์และไฟล์ขนาดใหญ่ เพื่อการโทรที่ง่ายดายโดยนักพัฒนาเว็บ คุณสามารถควบคุมสไตล์ได้อย่างง่ายดายและรับเอฟเฟกต์การอัพโหลดที่ต้องการผ่าน js และ css แต่บางทีเมื่อ ASP ค่อยๆ หายไปจากการพัฒนาเว็บ เจ้าหน้าที่จะให้บริการเฉพาะโปรแกรมประมวลผลการอัพโหลดสำหรับ .net, php และเวอร์ชันอื่นๆ เท่านั้น สำหรับนักพัฒนา ASP พวกเขาจำเป็นต้องจัดการการรับข้อมูลทางฝั่งเซิร์ฟเวอร์ด้วยตัวเอง
เมื่อฉันได้สัมผัสกับส่วนประกอบนี้เป็นครั้งแรก ฉันได้รับความสนใจจากฟังก์ชันอันทรงพลัง ความยืดหยุ่น และความสะดวกสบายของมัน เนื่องจากในขณะนั้นโครงการได้รับการพัฒนาโดยใช้ ASP Baidu จึงค้นพบหลังจากการวิจัยบางอย่างว่าไม่มีโปรแกรมประมวลผลการอัปโหลด ASP ที่มีประโยชน์ (ปัจจุบัน มีหลายอย่างครับ^^) เลยดูเหมือนผมทำเองได้แต่แรกๆก็ใช้วิธีประมวลผลการอัพโหลดแบบธรรมดาเพื่อดักจับข้อมูลไฟล์ครับ ข้อมูลไฟล์ที่ส่งผ่านโดยส่วนประกอบ ฉันไม่มีทางเลือกนอกจากเริ่มวิเคราะห์รูปแบบข้อมูลที่ส่งไป จากการวิเคราะห์ ฉันพบว่ารูปแบบข้อมูลที่ส่งยังคงแตกต่างจากการอัปโหลดทั่วไปอยู่บ้าง เข้าใจข้อมูลแล้ว ที่เหลือคือ การสกัดกั้น ฉันจะแบ่งปันวิธีการประมวลผลของฉันกับเพื่อน ๆ ที่ต้องการมัน ความเร็วในการประมวลผลค่อนข้างดี
คัดลอกรหัสรหัสดังต่อไปนี้:
-
คลาส SWUpload
formData ส่วนตัว, FolderPath, streamGet
ขนาดไฟล์ส่วนตัว, chunkSize, bofCont, eofCont
REM คลาสเริ่มต้น
คลาสย่อยส่วนตัว_เริ่มต้น
CallInitVariant
เซิร์ฟเวอร์ ScriptTimeOut = 1800
ตั้งค่า streamGet = Server.CreateObject (ADODB.Stream)
ผู้เขียน = 51JS.COM-ZMM
sVersion = อัปโหลดคลาส 1.0
จบหมวดย่อย
REM คลาสเริ่มต้น
ทรัพย์สินสาธารณะให้ SaveFolder (byVal sFolder)
ถ้า Right(sFolder, 1) = / จากนั้น
โฟลเดอร์พาธ = sFolder
อื่น
โฟลเดอร์พาธ = sFolder & /
สิ้นสุดถ้า
สิ้นสุดคุณสมบัติ
ทรัพย์สินสาธารณะรับ SaveFolder
SaveFolder = โฟลเดอร์พาธ
สิ้นสุดคุณสมบัติ
ฟังก์ชั่นส่วนตัว InitVariant
ขนาดก้อน = 1,024 * 128
folderPath = / : ขนาดไฟล์ = 1024 * 10
bofCont = StrToByte (ออคเต็ตสตรีม & vbCrlf & vbCrlf)
eofCont = StrToByte(vbCrlf & สตริง(12, -))
ฟังก์ชันสิ้นสุด
ฟังก์ชั่นสาธารณะ GetUploadData
หรี่ curRead : curRead = 0
Dim dataLen : dataLen = Request.TotalBytes
streamGet.Type = 1 : streamGet.Open
ทำในขณะที่ curRead < dataLen
Dim 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(ชื่อไฟล์=)
dim begPath : begPath = InStrB(1, formData, begMark & ChrB(34)) + 10
endPath จาง : endPath = InStrB(begPath, formData, ChrB(34))
Dim cntPath : cntPath = MidB (formData, begPath, endPath - begPath)
Dim cntName : cntName = folderPath & 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 filePath, 2
streamPut.Close : ตั้งค่า streamPut = ไม่มีเลย
สิ้นสุดถ้า
ฟังก์ชันสิ้นสุด
ฟังก์ชั่นส่วนตัวไม่มีอะไรเลย (byVal sVar)
IsNothing = IsNull(sVar) หรือ (sVar = ว่างเปล่า)
ฟังก์ชันสิ้นสุด
ฟังก์ชั่นส่วนตัว StrToByte (byVal sText)
สำหรับ i = 1 ถึง Len(sText)
StrToByte = StrToByte & ChrB(Asc(Mid(sText, i, 1)))
ต่อไป
ฟังก์ชันสิ้นสุด
ฟังก์ชั่นส่วนตัว ByteToStr (byVal sByte)
สตรีมสลัวTmp
ตั้งค่า streamTmp = Server.CreateObject(ADODB.Stream)
streamTmp.Type = 2
streamTmp.Mode = 3
streamTmp.เปิด
streamTmp.WriteText sByte
streamTmp ตำแหน่ง = 0
streamTmp.CharSet = utf-8
streamTmp ตำแหน่ง = 2
ByteToStr = streamTmp.ReadText
streamTmp.ปิด
ตั้งค่า streamTmp = ไม่มีเลย
ฟังก์ชันสิ้นสุด
ฟังก์ชั่นส่วนตัว GetClientName (byVal bInfo)
Dim sInfo, regEx
sInfo = ByteToStr(bInfo)
ถ้าไม่มีอะไร (sInfo) แล้ว
GetClientName=
อื่น
ตั้งค่า regEx = RegExp ใหม่
regEx.Pattern = ^.*//([^//]+)$
regEx.Global = เท็จ
regEx.IgnoreCase = จริง
GetClientName = regEx.Replace(sInfo, $1)
ตั้งค่า regEx = ไม่มีเลย
สิ้นสุดถ้า
ฟังก์ชันสิ้นสุด
ฟังก์ชั่นส่วนตัว GetParentFolder (byVal sPath)
Dim regEx
ตั้งค่า regEx = RegExp ใหม่
regEx.Pattern = ^(.*)//[^//]*$
regEx.Global = จริง
regEx.IgnoreCase = จริง
GetParentFolder = regEx.Replace(sPath, $1)
ตั้งค่า regEx = ไม่มีเลย
ฟังก์ชันสิ้นสุด
ฟังก์ชั่นส่วนตัว CreateFolder (byVal sLine, byVal sPath)
ฉO
ตั้งค่า oFso = Server.CreateObject (Scripting.FileSystemObject)
ถ้าไม่ใช่ oFso.FolderExists(sPath) แล้ว
Dim regEx
ตั้งค่า regEx = RegExp ใหม่
regEx.Pattern = ^(.*)//([^//]*)$
regEx.Global = เท็จ
regEx.IgnoreCase = จริง
sLine = sLine & regEx.Replace(sPath, $2) & |
sPath = regEx.แทนที่ (sPath, $1)
ถ้า CreateFolder(sLine, sPath) ดังนั้น CreateFolder = True
ตั้งค่า regEx = ไม่มีเลย
อื่น
ถ้า sLine = | แล้ว
CreateFolder = จริง
อื่น
Dim sTemp : sTemp = กลาง(sLine, 2, Len(sLine) - 2)
ถ้า InStrRev(sTemp, |) = 0 แล้ว
สไลน์ = |
sPath = sPath & / & sTemp
อื่น
โฟลเดอร์ Dim : โฟลเดอร์ = Mid(sTemp, InStrRev(sTemp, |) + 1)
sLine = |. & กลาง(sTemp, 1, InStrRev(sTemp, |) - 1) & |
sPath = sPath & / & โฟลเดอร์
สิ้นสุดถ้า
oFso.CreateFolder sPath
ถ้า CreateFolder(sLine, sPath) ดังนั้น CreateFolder = True
จบถ้า
สิ้นสุดถ้า
ตั้งค่า oFso = ไม่มีเลย
ฟังก์ชันสิ้นสุด
REM ยุติคลาส
Class_Terminate ย่อยส่วนตัว
streamGet.ปิด
ตั้งค่า streamGet = ไม่มีเลย
จบหมวดย่อย
จบคลาส
วิธีการโทร REM
หรี่แสง oUpload
ตั้งค่า oUpload = SWFUpload ใหม่
oUpload.SaveFolder = เส้นทางการจัดเก็บข้อมูล
oUpload.GetUploadData
ตั้งค่า oUpload = ไม่มีเลย
-