ملخص
تشرح هذه المقالة مثالاً لاستخدام تقنية XML لتحميل الملفات. لا تحتوي هذه الطريقة على قيود الطرق التقليدية. يوضح هذا المثال كيفية استخدام MSXML3.0 وكائن ADO Stream لتنفيذ أسلوب التحميل الجديد هذا. هناك العديد من الفوائد، مثل عدم الحاجة إلى مكون تحميل مخصص.
مقدمة
من أجل الحصول على وظيفة التحميل في صفحات ويب HTML، يمكننا استخدام التنسيق التالي للنموذج على العميل:
<FORM NAME="myForm"
الإجراء = "TargetURL.asp"
ENCTYPE = "متعدد الأجزاء/بيانات النموذج"
الطريقة = "آخر">
<نوع الإدخال = "ملف" NAME = "myFile">
<INPUT TYPE="submit" VALUE="تحميل الملف">
</FORM>
يحتوي هذا الحل على العديد من القيود على استخدام كل من العميل والخادم. أولاً، يتعين علينا استخدام طريقة POST لأن طريقة GET لا يمكنها التعامل مع بيانات النموذج هذه. وأيضًا، لا توجد طريقة لتشغيل إجراء POST دون استخدام نموذج. بعد إرسال البيانات إلى معالج النموذج، سيقوم المتصفح بتحميل المعالج كصفحة جديدة، وسيرى المستخدم انتقالًا غير سار للصفحة.
تحدد سمة ENCTYPE طريقة تشفير MIME للنموذج. يجب أن تستخدم سمة ENCTYPE للنموذج لتحميل الملفات "بيانات متعددة الأجزاء/النموذج". يؤدي تعيين هذه السمة إلى "بيانات النموذج/متعددة الأجزاء" إلى إنشاء مخزن مؤقت POST (بنية مركبة) يختلف عن البنية التقليدية لكائن طلب ASP الذي لا يمكنه الوصول إلى محتوى النموذج هذا. لذلك، يمكننا استخدام طريقة Request.binaryRead للوصول إلى هذه البيانات، لكن لا يمكننا القيام بذلك باستخدام لغة البرمجة النصية. يقوم الأسلوب Request.binaryRead بإرجاع بيانات نوع VTaray (صفيف نوع متغير يحتوي على أحرف أحادية البايت غير موقعة فقط). لكن لغات البرمجة النصية يمكنها فقط التعامل مع البيانات المتغيرة. لحل هذه المشكلة، يمكنك فقط استخدام مكونات تحميل ASP المخصصة، أو ملحقات ISAPI، مثل CPSHOST.DLL. هذا هو وجود قيود على التصميم.
خطة التحميل الجديدة
الخطوات التالية.
العميل:
قم
بإنشاء عقدة XML للمحتوى الثنائي. استخدم كائن ADO Stream لوضع بيانات الملف التي تم تحميلها في العقدة.
جانب:
اقرأ مستند XML من كائن الطلب، واقرأ البيانات الموجودة في العقدة الثنائية وقم بتخزينها في ملف على الخادم. بالطبع، يمكننا أيضًا تخزينه في حقل BLOB في قاعدة البيانات.
قبل شرح هذا الكود، يمكننا التفكير في هذا الحل.
أفكار حول XML
يدعم تنسيق XML العديد من أنواع البيانات، مثل البيانات الرقمية والعائمة والحرفية وما إلى ذلك. يعرّف العديد من المؤلفين XML على أنه تنسيق ASCII، لكن لا يمكننا تجاهل أن تقنية XML يمكنها أيضًا استخدام نوع البيانات "bin.base64" لوصف المعلومات الثنائية. هذه الميزة مدعومة بالكامل في محلل MS XML3.0، ولكنها تتطلب حاليًا بعض الإعدادات الخاصة. يوفر هذا الكائن بعض الخصائص التي تسمح بالتحكم الكامل في البيانات الثنائية:
obj_node.dataType - تحدد خاصية القراءة والكتابة نوع البيانات لعقدة معينة. يدعم المحلل اللغوي MSXML المزيد من أنواع البيانات (راجع MSDN: http://msdn.microsoft.com/library/psdk/xmlsdk/xmls3z1v.htm )
بالنسبة للبيانات الثنائية يمكننا استخدام النوع "bin.base64".
obj_node.nodeTypedValue - تحتوي خاصية القراءة والكتابة هذه على بيانات تمثل العقدة المحددة من حيث النوع المحدد.
يمكننا إنشاء مستند XML يحتوي على عقد متعددة من نوع bin.base64، والتي تحتوي على ملفات تم تحميلها. تتيح لك هذه الميزة تحميل ملفات متعددة مرة واحدة باستخدام مشاركة واحدة.
يمكننا استخدام كائن XMLHttpRequest وأسلوب POST لإرسال مستند XML إلى خادم الويب. يوفر هذا الكائن دعمًا لبروتوكول جانب العميل لخادم HTTP، مما يسمح بإرسال كائنات MS XMLDOM واستقبالها على خادم الويب. XMLHttpRequest هو كائن COM مضمن في Internet Explorer 5 (لا يتطلب التثبيت المخصص)، وليست هناك حاجة لتحويل الصفحة بعد الإرسال.
بالتفكير في كائن ADO Stream
يمكننا إنشاء مستند XML يحتوي على عقدة ثنائية واحدة أو أكثر من جانب العميل. علينا أيضًا ملء العقدة بمحتويات الملف. لسوء الحظ، لا تستطيع لغات البرمجة النصية الوصول إلى نظام الملفات المحلي، ولم يتمكن كائن Scripting.FileSystem (كائن مضمن في نظام Win32) من الوصول إلى الملفات الثنائية حتى الآن. هذا هو وجود قيود على التصميم. لذلك نحن بحاجة إلى العثور على كائن COM آخر يمكنه توفير الوصول إلى الثنائيات المحلية.
يوفر كائن ADO Stream (المكون في MDAC 2.5) وسيلة لقراءة بيانات الدفق الثنائية وكتابتها وإدارتها. يمكن أن يكون محتوى دفق البايت نصًا أو بيانات ثنائية، ولا يوجد حد للسعة. في ADO 2.5، لا ينتمي تقديم Microsoft لكائن Stream إلى أي طبقة من بنية كائن ADO، لذا يمكننا استخدام الكائن دون تجميعه.
في هذه المقالة، يتم استخدام كائن الدفق للوصول إلى محتوى الملف، ثم يتم تخزين المحتوى في عقدة XML.
على جانب العميل
كائنات Stream وMSXML لإكمال إجراء تحميل الملف.
<أتش تي أم أل>
<HEAD><TITLE>إرسال الملف</TITLE></HEAD>
<الجسم>
<معرف INPUT=btn_send name="btn_send" type=button value="FILE SEND">
<DIV id=div_message>جاهز</DIV>
</الجسم>
</HTML>
<SCRIPT LANGUAGE=javascript>
// وظيفة التحميل
الدالة btn_send.onclick()
{
// إنشاء كائن دفق ADO
var ado_stream = new ActiveXObject("ADODB.Stream");
// قم بإنشاء مستند XML يحتوي على معلومات الرأس الافتراضية والعقدة الجذرية
var xml_dom = new ActiveXObject("MSXML2.DOMDocument");
xml_dom.loadXML('<?xml version="1.0" ?> <root/>');
// حدد نوع البيانات
xml_dom.documentElement.setAttribute("xmlns:dt", "urn:schemas-microsoft-com:datatypes");
// أنشئ عقدة جديدة وقم بتعيينها كعقدة بيانات ثنائية
var l_node1 = xml_dom.createElement("file1");
l_node1.dataType = "bin.base64";
// افتح كائن الدفق واقرأ الملف المصدر
ado_stream.Type = 1; // 1=adTypeBinary
ado_stream.Open();
ado_stream.LoadFromFile("c:\tmp\myfile.doc");
// احفظ محتوى الملف في عقدة XML
l_node1.nodeTypedValue = ado_stream.Read(-1); // -1=adReadAll
ado_stream.Close();
xml_dom.documentElement.appendChild(l_node1);
// يمكنك إنشاء عقد ثنائية متعددة وتحميل ملفات متعددة في وقت واحد
// إرسال مستند XML إلى خادم الويب
var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
xmlhttp.open("POST"،"./file_recieve.asp"،false)؛
xmlhttp.send(xml_dom);
// عرض المعلومات التي أرجعها الخادم
div_message.innerHTML = xmlhttp.ResponseText;
}
</النص>
على جانب الخادم
نفس الكائن لتوفير وظيفة معالجة التحميل من جانب الخادم.
<%@ LANGUAGE=VBScript%>
<% خيار صريح
Response.Expires = 0
' تحديد المتغيرات والكائنات.
ado_stream خافت
dimxml_dom
dim xml_file1
'إنشاء كائن دفق
تعيين ado_stream = Server.CreateObject("ADODB.Stream")
' قم بإنشاء كائن XMLDOM من كائن الطلب
تعيين xml_dom = Server.CreateObject("MSXML2.DOMDocument")
xml_dom.load(طلب)
'قراءة العقد التي تحتوي على بيانات ثنائية
set xml_file1 = xml_dom.selectSingleNode("root/file1")
'افتح كائن الدفق وقم بتخزين البيانات فيه
ado_stream.Type = 1 ' 1=adTypeBinary
ado_stream.open
ado_stream.Write xml_file1.nodeTypedValue
'حفظ الملف
ado_stream.SaveToFile "c:tmpupload1.doc",2 ' 2=adSaveCreateOverWrite
ado_stream.إغلاق
'تدمير الكائن
تعيين ado_stream = لا شيء
تعيين xml_dom = لا شيء
'إعادة المعلومات إلى المتصفح
الاستجابة.اكتب "تم التحميل بنجاح!"
%>
يمكنك أيضًا استخدام كائن الدفق لوضع البيانات في حقل BLOB بقاعدة البيانات.
وتتمثل فائدة استخدام هذه الطريقة في
أنها لا تسبب تحويلات للصفحة.
ليست هناك حاجة لمكونات خاصة.
يمكن تحميل ملفات متعددة في نفس الوقت.
هذا البرنامج مكتوب بخط خالص ويمكن إدراجه بسهولة في أكواد أخرى دون التعاون مع أي كائنات HTML. يمكن أيضًا تنفيذ هذا المنطق بأي لغة تدعم معيار COM.
اعتبارات أمان النظام:
لا يمكن استخدام هذه الطريقة إلا على الشبكات الداخلية لأنها تتطلب ضبط مستوى أمان IE5 على "منخفض". مطلوب:
السماح بالبرامج النصية وكائنات ActiveX. يسمح هذا الإعداد للمتصفح بتنفيذ عبارات JScript مثل "myobj = new activexobject(...)";
يجب السماح بالوصول عبر المجال إلى مصدر البيانات. يسمح هذا الإعداد باستخدام كائنات الدفق من جانب العميل. يجب أيضًا تثبيت MS XML DOM 3.0 وMDAC 2.5 على كل من الخادم والعميل.