من حيث سرعة فك التشفير، فإن Huajing 2.0 مرتفع جدًا بالفعل، ومع ذلك، لا يزال يعاني من المشكلتين التاليتين:
1. استخدم Data_5xsoft.Write Request.BinaryRead(Request.TotalBytes) لقراءة جميع البيانات مرة واحدة، واستخدم RequestData =Data_5xsoft.Read للحصول على جميع البيانات مرة واحدة. عندما تكون البيانات التي تم تحميلها كبيرة جدًا، سيفشل التحميل بسبب ذلك لعدم كفاية الذاكرة، يجب استخدام طريقة القراءة المجزأة.
2. عند حفظ البيانات، تحتاج إلى نسخها من Data_5xsoft إلى دفق مؤقت أولاً. عند حفظ ملف كبير، تكون هناك حاجة إلى ضعف موارد التخزين. عند الاختبار في حالة مستقلة، يمكن العثور على أن وقت الحفظ يزداد بشكل حاد مع حجم الملف، حتى تجاوز وقت التحميل ووقت فك التشفير.
يستخدم الفصل الذي كتبته طريقة قراءة كتلة تلو الأخرى أثناء عملية فك التشفير (ملاحظة: حجم الكتلة لا يتناسب مع السرعة. يُظهر اختبار الجهاز الواحد أن 64 ألف كتلة أسرع بكثير من كتلة 1 مليون) لحل المشكلة 1 وفي الوقت نفسه، نستخدم طريقة كتابة البيانات العادية في سير العمل، وكتابة محتوى الملف مباشرةً في التدفق الخاص بالملف لحل المشكلة 2.
الكود كما يلي، الاستخدام مشابه لـ Huajing:
Server.ScriptTimeOut = 600
Class QuickUpload
FFile الخاص، FFile، Upload_Stream، ConvertStream
الحصول على نموذج الملكية
setForm = FForm
الملكية النهائية
خاصية الحصول على الملف
setFile = FFile
الملكية النهائية
فئة فرعية خاصة_تهيئة
خافت iStart، iEnd، الحدود، FieldName، FileName، 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
تحويلستريم.تشارسيت = "GB2312"
إذا كان Request.TotalBytes <1، فقم بالخروج من Sub
'dStart = CDbl(الوقت)
"ابحث عن الحدود الأولى."
iStart = Search(Upload_Stream, ChrB(13)&ChrB(10), 1)
"احصل على سلسلة الحدود."
الحدود = سلسلة فرعية (1، iStart-1، خطأ)
"إذا لم تكن حدود النهاية، فسوف تتكرر."
افعل ذلك أثناء StrComp(subString(iStart, 2, false),ChrB(13)&ChrB(10))=0
اي ستارت = اي ستارت+2
'احصل على رأس معلومات عنصر النموذج
تفعل بينما صحيح
iEnd = بحث (Upload_Stream، ChrB(13)&ChrB(10)، iStart)
'تحليل رأس المعلومات
السطر = سلسلة فرعية (iStart، iEnd-iStart، صحيح)
'تحرك الموقف
iStart = iEnd+2
إذا كان الخط = "" ثم قم بالخروج
نقاط البيع = instr (خط، "):")
إذا نقاط البيع> 0 ثم
إذا StrComp(left(Line,pos-1),"Content-Disposition",1)=0 إذن
'احصل على اسم عنصر النموذج
اسم الحقل = ExtractValue(Line,pos+1,"name")
"الحصول على اسم الملف
اسم الملف = ExtractValue(Line,pos+1,"filename")
'حذف مسار الملف
اسم الملف = منتصف (اسم الملف، InStrRev (اسم الملف، "")+1)
elseif StrComp(left(Line,pos-1),"Content-Type",1)=0 ثم
"الحصول على نوع الملف
نوع المحتوى = تقليم (منتصف (خط، نقاط البيع + 1))
نهاية إذا
نهاية إذا
حلقة
'احصل على محتوى عنصر النموذج
إذا كان اسم الملف<>"" إذن
"محتوى الملف الجديد."
اضبط الملف = FileInfo الجديد
theFile.Init اسم الملف، نوع المحتوى
'انقل محتوى دفق الملف إلى دفق الملف
MoveData Upload_Stream، theFile.Stream، iStart
'يتم نقل بيانات التحميل مباشرة إلى دفق الملفات، مما قد يقلل من وقت تخزين الملف
iEnd = Search(theFile.Stream, border, 1)
"نقل البيانات اللاحقة إلى سير العمل."
MoveData theFile.Stream، Upload_Stream، iEnd-2
'
FFile.add اسم الحقل، الملف
'تحرك الموقف
iStart = iStart+2+LenB(الحدود)
آخر
"ابحث عن الحدود."
iEnd = بحث (Upload_Stream، الحدود، iStart)
'احصل على محتوى عنصر النموذج
ItemValue = subString(iStart, iEnd-2-iStart, true)
'
إذا كان FFform.Exists(FieldName) إذن
FForm.Item(FieldName) = FForm.Item(FieldName) & "،" & ItemValue
آخر
FForm.Add FieldName، ItemValue
نهاية إذا
'تحرك الموقف
iStart = iEnd+LenB(الحدود)
نهاية إذا
حلقة
'Response.اكتب "وقت التحليل:" & FormatNumber((CDbl(Time)-dStart)*24*60*60,-1,-1) & "<br>"
نهاية البحث عن الوظائف الخاصة الفرعية
(src، str، theStart)
iStart = theStart
نقاط البيع=0
افعل بينما pos=0
'الطول ليس طويلاً بما يكفي، اقرأ قطعة واحدة
إذا كان src.Size<(iStart+lenb(str)-1) ثم ReadChunk src
'احصل على قطعة من البيانات بحجم 64 كيلو بايت تقريبًا، والتي يمكن أن تقلل متطلبات الذاكرة
src.Position = iStart-1
buf = src.Read
"الكشف عن الحدود."
pos=InStrB(buf,str)
'إذا لم يتم العثور عليه، انتقل إلى الخلف
إذا pos=0 ثم iStart = iStart+LenB(buf)-LenB(str)+1
حلقة
البحث = iStart+pos-1
وظيفة النهاية
نقل البيانات الفرعية الخاصة (Src، Dest، theStart)
Src.Position = البداية-1
Dest.Position = Dest.Size
Src.CopyTo det
Src.Position = البداية-1
Src.SetEOS
النهاية الفرعية
وظيفة خاصة ExtractValue (خط، نقطة البيع، الاسم)
خافت ر، ص
قيمة الاستخراج = ""
ر = الاسم + "=""
ع = instr (نقاط البيع، الخط، ر)
إذا كان p>0 إذن
n1 = ص+لين(ر)
n2 = instr(n1,line,""")
إذا n2>n1 ثم ExtractValue = mid(line,n1,n2-n1)
نهاية إذا
وظيفة النهاية
سلسلة فرعية خاصة (theStart، theLen، ConvertToUnicode)
إذا كان theLen>0 ثم
'عندما لا يكون الطول كافيًا، اقرأ جزءًا من البيانات
إذا كان Upload_Stream.Size<theStart+theLen-1 ثم ReadChunk Upload_Stream
Upload_Stream.Position=theStart-1
ثنائي =Upload_Stream.Read(theLen)
إذا ConvertToUnicode بعد ذلك
تحويل ستريم.نوع = 1
تحويل ستريم.فتح
تحويل ستريم.كتابة ثنائي
تحويل ستريم.الموقف = 0
تحويل ستريم.نوع = 2
سلسلة فرعية = ConvertStream.ReadText
تحويل ستريم.إغلاق
آخر
سلسلة فرعية = midB(ثنائي،1)
نهاية إذا
آخر
سلسلة فرعية = ""
نهاية إذا
وظيفة النهاية
قطعة القراءة الفرعية الخاصة (src)
'قراءة كتلة، من خلال قراءة 64 كيلو بايت في كل مرة، يمكنك منع تجاوز سعة الذاكرة عندما تكون كمية البيانات كبيرة جدًا
إذا كان Response.IsClientConnected = خطأ، فارفع "تمت مقاطعة اتصال الشبكة"
بايت القراءة = 65536
src.Position = src.Size
src.كتابة الطلب.BinaryRead(BytesRead)
نهاية الفرعية
"معلومات الاستثناء."
رفع فرعي خاص (رسالة)
Err.Raise vbObjectError، "QuickUpload"، الرسالة
نهاية
الفئة الفرعية الخاصة_Terminate
form.RemoveAll
file.RemoveAll
تعيين النموذج = لا شيء
تعيين الملف = لا شيء
تحميل_البث.إغلاق
اضبط Upload_Stream=لا شيء
تحويل ستريم.إغلاق
setConvertStream=لا شيء
End Sub
End Class
Class FileInfo
اسم FFileName الخاص، FFileType، FFileStart، FFileSize، FStream
الخاصية تحصل على FileName
اسم الملف = FFileName
الملكية النهائية
الخاصية تحصل على FileType
نوع الملف = FFileType
الملكية النهائية
الخاصية تحصل على FileSize
حجم الملف = FStream.Size
الملكية النهائية
خاصية getStream
setStream = FStream
الملكية النهائية
Init الفرعي العام (AFileName، AFileType)
FFileName = AFileName
FFileType = AFileType
نهاية الفرعية
الوظيفة العامة SaveAs(FullPath)
خافت الدكتور،ErrorChar،i
'dStart = CDbl(الوقت)
حفظ باسم=1
إذا كان تقليم (fullpath) = "" أو يمين (fullpath، 1) = "/" ثم قم بالخروج من الوظيفة
على خطأ استئناف التالي
FStream.SaveToFile FullPath،2
إذا كان Err.Number>0، فاكتب Response.Write "خطأ في حفظ البيانات:" & Err.Description & "<br>"
حفظ باسم=0
'Response.اكتب "توفير الوقت:" & FormatNumber((CDbl(Time)-dStart)*24*60*60,-1,-1) & "<br>"
وظيفة النهاية
فئة فرعية خاصة_تهيئة
تعيين FStream=CreateObject("Adodb.Stream")
FStream.mode=3
FSstream.type=1
FSstream.open
النهاية الفرعية
فئة فرعية خاصة_إنهاء
FStream.Close
تعيين FStream = لا شيء
النهاية الفرعية
نهاية الفصل