فكرة الكتابة: قم بتشفير الملف المحلي باستخدام base64 على العميل ثم أرسله إلى الوجهة.
أثناء الاختبار، كان الملف الذي تم تحميله كبيرًا جدًا، مما تسبب في انتهاء المهلة والفشل.
تم تحسينه لاحقًا، وتم إرسال الترميز إلى أجزاء، وكان اختبار 20M ناجحًا.
الغرض من الكتابة: في الحل التقليدي، يمكنك تحديد وتحميل ملف واحد في كل مرة، ومع ذلك، يكون الأمر أكثر صعوبة عندما يتعلق الأمر بقراءة مسارات الملفات في قاعدة البيانات وتحميل هذه الملفات إلى مكان واحد.
من الممكن بالطبع استخدام بروتوكول نقل الملفات للعثور على المسارات واحدًا تلو الآخر، لكن العثور على هذه الملفات في كل مرة سيستغرق وقتًا أطول بالنسبة لي. الغرض من كتابة هذا هنا بشكل أساسي هو الحصول على الملفات من خلال مسار الملف في قاعدة البيانات وتحميل الملفات إلى مكان واحد على دفعات في المرة الواحدة.
والغرض الرئيسي هو تدريب نفسك.
عملية الحل: في البداية، حاولت استخدام محاكاة إدخال لوحة المفاتيح لتعيين القيم بقوة للتحكم في الملف وتحميلها بالطريقة التقليدية. لكنني أواجه دائمًا قيمًا فارغة، وحتى العديد من الملفات لا يتم إرسالها. بعد استشارة بعض المعلومات، أقوم الآن بجلب جميع المسارات من خلال قاعدة البيانات وكتابتها في ملف js. ثم استخدم js في مكتب الاستقبال لقراءة هذه المسارات وإرسال الملف عبر xmlhttp.
لأن Internet Explorer لا يحب xmlHttp كثيرًا ويعتقد دائمًا أن لديه سلوكًا ضارًا، لذلك فهو يقدم تحذيرات دائمًا، لذلك لا يمكنك استخدام مسار الويب أثناء التشغيل، يمكنك فقط استخدام المسار الفعلي للوصول إليه.
ثم يحتوي الخادم على ملف لتلقي هذه الترميزات وفك تشفيرها، لذلك أسميه c/s
في الوقت الحاضر، لا يزال يجري تحسين العديد من الرموز.
مقدمة مختصرة:
-------------------------------------------------- ----------
aryFiles.push(c://aaa.zip);
aryFiles.push(c://bbb.exe);
هنا هو مسار الملف وملف يمكن أن يكون متعددا
في المستقبل، يمكن أيضًا الحصول على هذا المسار على العميل من خلال التحكم في الملف.
http://www.xxx.com/xxx/xxx.asp
هذه هي الوجهة، يمكنك تغييرها إلى العنوان الذي تريده.
ado_stream.LoadFromFile(server.mappath(.) &/& + str_filename)
server.mappath(.) &/& + str_filename هنا الملف المراد قراءته.
server.mappath(.) &/& المسار متوافق مع مسار التخزين
ado_stream.SaveToFile server.mappath(.) &/& str_filename,2
server.mappath(.) &/& هذا هو المسار لتخزين الملف str_filename هو اسم الملف
يتم وضع القراءة والتخزين هنا في الدليل الذي تم وضع البرنامج فيه، ويمكنك أيضًا الاحتفاظ به هكذا عند الاختبار.
ضع الجزء الأول من التعليمات البرمجية محليًا (على سبيل المثال:c:/upload.htm)
ضع الجزء الثاني من التعليمات البرمجية على الخادم، والذي يمكن أن يكون خادمًا محليًا أو خادمًا عامًا، وحافظ على اتساقه مع الوجهة أعلاه.
(على سبيل المثال:http://www.xxx.com/upload.asp أو http://localhost/www/upload.asp)
-------------------------------------------------- ---------------
الإجراء: ابحث عن مكان حفظ الجزء الأول من التعليمات البرمجية. فقط قم بتنفيذه (على سبيل المثال: افتح محرك الأقراص c وقم بتنفيذ upload.htm)
رمز العميل</P><P><html><head></head><body> <input type=button onclick=BeginSendFiles(); value=Send/> <input type=button onclick=JavaScript: Breaked= true value=interrupt/> <div id=ddd width=300px></div> </br> <DIV; id=div_message></DIV></body></P><P><script language=VBScript>الدالة bytes2BSTR(vIn) strReturn = For i = 1 إلى LenB(vIn) ThisCharCode = AscB(MidB(vIn,i ,1)) إذا كان ThisCharCode < &H80 ثم strReturn = strReturn & Chr(ThisCharCode) Else NextCharCode = AscB(MidB(vIn,i+1,1)) strReturn = strReturn & Chr(CLng(ThisCharCode) * &H100 + CInt(NextCharCode)) i = i + 1 End If Next bytes2BSTR = strReturnEnd Function</script></P ><P><script language=javascript> var xmlhttp var ado_stream var mFileName, mPartStart; mPartID, mPartEnd; var SendCount; var BlockSize; var aryFiles;</P><P> BlockSize = 1024*100; // عدد البايتات المرسلة في كل مرةBreaked = false; P> P><P> // ابدأ في إرسال الملفات function BeginSendFiles() { initAryFiles(); } // إنشاء مصفوفة من الملفات المراد إرسالها function initAryFiles() { aryFiles.push(c://aaa.zip) ; aryFiles.push(c://bbb.exe) ;//c://aaa. zip c ://bbb.exe ملف محلي aryFiles.reverse() ;// اسم الملف</P><P> function SendFile(vFullPath) { // لن يتم تحميل الملف الفارغ إذا (!vFullPath) { return } Breaked = false ; div_message.innerHTML = ; ado_stream = new ActiveXObject(ADODB.Stream); ); // اقرأ الملف ado_stream.position = 0;</P><P> SendCount = Math.ceil(ado_stream.size/BlockSize) ; // إذا كان هناك باقي، أرسل مرة أخرى</P><P> // تنبيه (SendCount) ;</P><P> var reg = //b /w+$/gi mFileName = reg.exec(vFullPath) ; mPartStart = true ; { if (SendCount > 0) { var dom = new ActiveXObject(msxml2.DOMDocument); // إرسال ملف xml dom.async = false; dom.resolveExternals = false;</P><P> // إنشاء رأس ملف xml var العقدة = dom.createProcessingInstruction(xml,version='1.0'); dom.appendChild(node = null; قم ببناء العقدة الجذرية var root = dom.createElement(root); dom.appendChild(root); dom.documentElement.setAttribute(xmlns:dt, urn:schemas-microsoft-com:datatypes); عقدة البيانات الثنائية = dom.createElement(upData); ترميز base64 var att = dom.createAttribute(FileName); // سمة اسم الملف att.value = mFileName; .value = mPartStart; رقم القسم att.value = mPartID;node.setAttributeNode(att); var att = dom.createAttribute(PartEnd); ;</P><P> root.appendChild(node) ; تتم قراءة بيانات العقدة من الدفق، العقدة ذات الطول الثابت = null SendCount -= 1; xmlhttp = new ActiveXObject(Microsoft.XMLHTTP); xmlhttp.open(POST,http://www.xxx.com/xxx/xxx.asp, false); //http://www.xxx.com/xxx/xxx.asp هو الملف الموجود على مسار الويب xmlhttp.onreadystatechange= CallBack; = null } else { ado_stream.Close(); ado_stream = null } } function CallBack() { // تم التحميل بنجاح if(xmlhttp.readystate == 4) { // تحقق مما إذا كان التحميل قد تمت مقاطعته if(Breaked) { return </P><P> if (SendCount > 0) { mPartID += 1; xmlhttp.ResponseText) ; var p = Math.floor((mPartID/(Math.ceil(ado_stream.size/BlockSize) + 1)) * 100) ; );, 1) } else { // اكتمل نقل الملف //div_message.innerHTML += mFileName + اكتمل النقل! ;</P><P> // متابعة تمرير الملف التالي ShowBar(0) ; var cFile = aryFiles.pop() ; } } </P><P> </P>< P > function ShowBar(per) { // شريط التقدم ddd.innerHTML = <table width='200' border=0 cellpadding='0' cellpacing='0' ><tr><td bgcolor='#6699FF'><input type=button style=' width: + per + % ; border:0px; </table> ; </P><P></script></html></P><P>
جانب الخادم
</P><P><%@ LANGUAGE=VBScript%><% الخيار ExplicitResponse.Expires = 0 </P><P>' تعريف المتغيرات والكائنات. خافت ado_streamdim xml_domdim xml_datadim str_filenamedim bol_PartStartdim int_PartIDdim bol_PartEnd </P><P>' إنشاء مجموعة كائنات الدفق ado_stream = Server.CreateObject(ADODB.Stream)' إنشاء كائن XMLDOM من مجموعة كائنات الطلب xml_dom = Server.CreateObject(MSXML2.DOMDocument)xml_dom.load(request)' اقرأ العقدة التي تحتوي على مجموعة البيانات الثنائية xml_data = xml_dom.selectSingleNode(root/upData)str_filename = xml_data.getAttribute(FileName)bol_PartStart = CBool(xml_data.getAttribute(PartStart ))int_PartID = CInt(xml_data.getAttribute(PartID))bol_PartEnd = CBool(xml_data.getAttribute(PartEnd))</P><P>' افتح كائن الدفق وقم بتخزين البيانات فيه ado_stream.Type = 1 ' 1=adTypeBinary ado_stream.open إذا لم يكن bol_PartStart ثم ado_stream.LoadFromFile(server.mappath(.) &/& + str_filename) ' اقرأ الملف ado_stream.position = ado_stream.sizeend ifado_stream.Write xml_data.nodeTypedValue' File save ado_stream.SaveToFile server.mappath(.) &/& str_filename,2'Save file 2=adSaveCreateOverWrite ado_stream. Close </P><P> 'تحرير الموارد المعينة ado_stream = لا شيء محدد xml_dom = لا شيء' قم بإرجاع المعلومات إلى المتصفح Response.Write Upload ناجح!& str_filename & int_PartID & bol_PartStart%> </P><P>