ในแง่ของความเร็วในการถอดรหัส Huajing 2.0 นั้นสูงมากอยู่แล้ว อย่างไรก็ตาม ยังคงมีปัญหาสองประการดังต่อไปนี้:
1. ใช้ Data_5xsoft.Write Request.BinaryRead(Request.TotalBytes) เพื่ออ่านข้อมูลทั้งหมดในครั้งเดียว และใช้ RequestData =Data_5xsoft.Read เพื่อรับข้อมูลทั้งหมดในครั้งเดียว เมื่อข้อมูลที่อัปโหลดมีขนาดใหญ่เกินไป การอัปโหลดจะล้มเหลวเนื่องจาก เพื่อให้มีหน่วยความจำไม่เพียงพอ ซึ่งควรใช้วิธีแบ่งส่วนการอ่าน
2. เมื่อบันทึกข้อมูล คุณต้องคัดลอกจาก Data_5xsoft ไปยังสตรีมชั่วคราวก่อน เมื่อบันทึกไฟล์ขนาดใหญ่ จำเป็นต้องใช้ทรัพยากรการจัดเก็บข้อมูลเป็นสองเท่า เมื่อทดสอบในสถานะสแตนด์อโลน จะพบว่าเวลาในการประหยัดเวลาเพิ่มขึ้น คมชัดด้วยขนาดไฟล์ แม้จะใช้เวลานานในการอัพโหลดและถอดรหัสก็ตาม
ชั้นเรียนที่ฉันเขียนใช้วิธีการอ่านบล็อกทีละบล็อกในระหว่างกระบวนการถอดรหัส (หมายเหตุ: ขนาดของบล็อกไม่แปรผันกับความเร็ว การทดสอบด้วยเครื่องเดียวแสดงให้เห็นว่าบล็อก 64K นั้นเร็วกว่าบล็อก 1M มาก) เพื่อแก้ไขปัญหา 1 . และในเวลาเดียวกัน เราก็ใช้วิธีการเขียนข้อมูลธรรมดาลงในเวิร์กโฟลว์ และเขียนเนื้อหาไฟล์ลงในสตรีมของไฟล์โดยตรงเพื่อแก้ไขปัญหา 2
รหัสเป็นดังนี้ การใช้งานคล้ายกับ Huajing:
Server.ScriptTimeOut = 600
Class QuickUpload
FForm ส่วนตัว, FFile, Upload_Stream, ConvertStream
แบบฟอร์มการรับทรัพย์สิน
setForm = FForm
ทรัพย์สินสุดท้าย
คุณสมบัติรับไฟล์
setFile = FFile
ทรัพย์สินสุดท้าย
คลาสย่อยส่วนตัว_เริ่มต้น
dim iStart, iEnd, ขอบเขต, FieldName, ชื่อไฟล์, ContentType, ItemValue, theFile, LineEnd
ตั้งค่า FForm=CreateObject("Scripting.Dictionary")
ตั้ง FFile=CreateObject("Scripting.Dictionary")
ตั้งค่า Upload_Stream=CreateObject("Adodb.Stream")
Upload_Stream.mode=3
Upload_Stream.type=1
Upload_Stream.open
ตั้ง ConvertStream = Server.CreateObject("adodb.stream")
ConvertStream.Mode =3
ConvertStream.Charset="GB2312"
ถ้า Request.TotalBytes<1 ให้ออกจาก Sub
'dStart = CDbl(เวลา)
'ค้นหาขอบเขตแรก
iStart = ค้นหา (Upload_Stream, ChrB(13)&ChrB(10), 1)
'รับสายขอบเขต
ขอบเขต = subString (1, iStart-1, false)
'ถ้าไม่ใช่ขอบเขตสุดท้าย มันก็จะวนซ้ำ'
ทำในขณะที่ StrComp(subString(iStart, 2, false),ChrB(13)&ChrB(10))=0
ไอสตาร์ท = ไอสตาร์ท+2
'รับส่วนหัวข้อมูลรายการแบบฟอร์ม
ทำในขณะที่เป็นจริง
iEnd = ค้นหา (Upload_Stream, ChrB(13)&ChrB(10), iStart)
'แยกย่อยส่วนหัวข้อมูล
บรรทัด = subString (iStart, iEnd-iStart, จริง)
'ย้ายตำแหน่ง
iStart = iEnd+2
ถ้า Line="" ให้ Exit do
pos = instr(บรรทัด,::)
ถ้า pos>0 แล้ว
ถ้า StrComp(left(Line,pos-1),"Content-Disposition",1)=0 แล้ว
'รับชื่อรายการแบบฟอร์ม
FieldName = ExtractValue(Line,pos+1,"ชื่อ")
'รับชื่อไฟล์
FileName = ExtractValue(Line,pos+1,"ชื่อไฟล์")
'ลบเส้นทางไฟล์
ชื่อไฟล์ = Mid(ชื่อไฟล์,InStrRev(ชื่อไฟล์, "")+1)
elseif StrComp(left(Line,pos-1),"Content-Type",1)=0 แล้ว
'รับประเภทไฟล์
ContentType = ตัด (กลาง (บรรทัด, pos + 1))
สิ้นสุดถ้า
สิ้นสุดถ้า
วนซ้ำ
'รับเนื้อหารายการแบบฟอร์ม
ถ้า FileName<>"" แล้ว
'เนื้อหาไฟล์ใหม่
ตั้งค่าไฟล์ = FileInfo ใหม่
theFile.Init ชื่อไฟล์ ContentType
'ย้ายเนื้อหาสตรีมไฟล์ไปยังสตรีมไฟล์
MoveData Upload_Stream, theFile.Stream, iStart
'ข้อมูลที่อัปโหลดจะถูกถ่ายโอนโดยตรงไปยังสตรีมไฟล์ ซึ่งสามารถลดเวลาการจัดเก็บไฟล์ได้
iEnd = ค้นหา (theFile.Stream, ขอบเขต, 1)
'ย้ายข้อมูลที่ตามมาเข้าสู่เวิร์กโฟลว์
MoveData theFile.Stream, Upload_Stream, iEnd-2
-
FFile.add FieldName, ไฟล์
'ย้ายตำแหน่ง
iStart = iStart+2+LenB(ขอบเขต)
อื่น
'ค้นหาขอบเขต
iEnd = ค้นหา (Upload_Stream, ขอบเขต, iStart)
'รับเนื้อหารายการแบบฟอร์ม
ItemValue = subString (iStart, iEnd-2-iStart, จริง)
-
ถ้า FForm.Exists(FieldName) แล้ว
FForm.Item(FieldName) = FForm.Item(FieldName) & "," & ItemValue
อื่น
FForm.Add FieldName, ItemValue
สิ้นสุดถ้า
'ย้ายตำแหน่ง
iStart = iEnd+LenB(ขอบเขต)
สิ้นสุดถ้า
วนซ้ำ
'Response.Write "เวลาแยกวิเคราะห์:" & FormatNumber((CDbl(Time)-dStart)*24*60*60,-1,-1) & "<br>"
สิ้นสุด
การค้นหาฟังก์ชันส่วนตัวย่อย (src, str, theStart)
iStart = เดอะสตาร์ท
ตำแหน่ง=0
ทำในขณะที่ pos=0
ยาวไม่พอ อ่านเล่มเดียวจบ
ถ้า src.Size<(iStart+lenb(str)-1) จากนั้น ReadChunk src
'รับชิ้นส่วนข้อมูลประมาณ 64K ซึ่งสามารถลดความต้องการหน่วยความจำได้
src.Position = iStart-1
buf = src อ่าน
'ตรวจจับขอบเขต
pos=InStrB(buf,str)
'ถ้าหาไม่เจอให้ถอยกลับไป'
ถ้า pos=0 ดังนั้น iStart = iStart+LenB(buf)-LenB(str)+1
วนซ้ำ
ค้นหา = iStart+pos-1
สิ้นสุดฟังก์ชัน
MoveData ส่วนตัวย่อย (Src, Dest, theStart)
Src.Position = theStart-1
ตำแหน่งปลายทาง = ขนาดปลายทาง
Src.CopyTo ปลายทาง
Src.Position = theStart-1
Src.SetEOS
จบย่อย
ฟังก์ชั่นส่วนตัว ExtractValue (บรรทัด, pos, ชื่อ)
สลัว t, p
แยกค่า = ""
เสื้อ = ชื่อ + "="""
p = instr(pos,line,t)
ถ้า p>0 แล้ว
n1 = p+เลน(t)
n2 = instr(n1,line,"""")
ถ้า n2>n1 ดังนั้น ExtractValue = mid(line,n1,n2-n1)
สิ้นสุดถ้า
ฟังก์ชั่นสิ้นสุด
ฟังก์ชั่นส่วนตัว subString (theStart, theLen, ConvertToUnicode)
ถ้า theLen>0 แล้ว
'เมื่อความยาวไม่เพียงพอ ให้อ่านข้อมูลชิ้นหนึ่ง
ถ้า Upload_Stream.Size<theStart+theLen-1 แล้ว ReadChunk Upload_Stream
Upload_Stream.Position=theStart-1
ไบนารี =Upload_Stream.Read(theLen)
ถ้า ConvertToUnicode แล้ว
ConvertStream.Type = 1
แปลงสตรีมเปิด
ConvertStream.Write ไบนารี
ConvertStream ตำแหน่ง = 0
ConvertStream.Type = 2
subString = ConvertStream.ReadText
แปลงสตรีมปิด
อื่น
สตริงย่อย = midB (ไบนารี 1)
สิ้นสุดถ้า
อื่น
สตริงย่อย = ""
สิ้นสุดถ้า
สิ้นสุดฟังก์ชัน
ReadChunk ย่อยส่วนตัว (src)
'อ่านบล็อกโดยการอ่านครั้งละ 64K คุณสามารถป้องกันหน่วยความจำล้นได้เมื่อปริมาณข้อมูลมีขนาดใหญ่เกินไป
ถ้า Response.IsClientConnected = false ให้ยก "การเชื่อมต่อเครือข่ายถูกขัดจังหวะ"
ไบต์อ่าน = 65536
src.Position = src.ขนาด
src.เขียนคำขอ BinaryRead (BytesRead)
จบหมวดย่อย
'ข้อมูลข้อยกเว้น
การเพิ่มย่อยส่วนตัว (ข้อความ)
Err.Raise vbObjectError, "QuickUpload", ข้อความ
สิ้นสุด
คลาสย่อยส่วนตัวย่อย_ยุติ
แบบฟอร์ม RemoveAll
ไฟล์ RemoveAll
กำหนดรูปแบบ=ไม่มีอะไร
ตั้งค่าไฟล์=ไม่มีอะไร
Upload_Stream.ปิด
ตั้งค่า Upload_Stream=nothing
แปลงสตรีมปิด
setConvertStream=ไม่มีอะไรเลย
สิ้นสุด ย่อย
สิ้นสุดคลาส คลาส
FileInfo
FFileName ส่วนตัว, FFileType, FFileStart, FFileSize, FStream
คุณสมบัติรับ FileName
ชื่อไฟล์ = FFileName
ทรัพย์สินสุดท้าย
คุณสมบัติรับ FileType
FileType = FFileType
ทรัพย์สินสุดท้าย
คุณสมบัติรับ FileSize
FileSize = FStream.Size
ทรัพย์สินสุดท้าย
คุณสมบัติ getStream
setStream = FStream
ทรัพย์สินสุดท้าย
เริ่มต้นย่อยสาธารณะ (AFileName, AFileType)
FFileName = AFileName
FFileType = AFileType
จบหมวดย่อย
ฟังก์ชั่นสาธารณะ SaveAs(FullPath)
dr มัว, ErrorChar, i
'dStart = CDbl(เวลา)
บันทึกเป็น=1
ถ้า trim(fullpath)="" หรือ right(fullpath,1)="/" ให้ออกจากฟังก์ชัน
เมื่อเกิดข้อผิดพลาด ดำเนินการต่อต่อไป
FStream.SaveToFile FullPath,2
ถ้า Err.Number>0 แล้ว Response.Write "เกิดข้อผิดพลาดในการบันทึกข้อมูล:" & Err.Description & "<br>"
บันทึกเป็น=0
'Response.Write "ประหยัดเวลา:" & FormatNumber((CDbl(Time)-dStart)*24*60*60,-1,-1) & "<br>"
ฟังก์ชั่นสิ้นสุด
คลาสย่อยส่วนตัว_เริ่มต้น
ตั้ง FStream=CreateObject("Adodb.Stream")
FStream.mode=3
FStream.type=1
FStream.open
จบย่อย
Class_Terminate ย่อยส่วนตัว
FStream.ปิด
ตั้งค่า FStream=nothing
จบย่อย
จบคลาส