ASP (صفحة الخادم النشطة) هو أحد منتجات Microsoft نظرًا لأنه سهل البرمجة ويمكنه تطوير مواقع ويب ديناميكية ذات وظائف قوية بسرعة، فإن العديد من مواقع الويب (خاصة شبكات الإنترانت/الإكسترانت الداخلية) تعتمد الآن نموذج NT+IIS+ASP، مما يجعل ASP هو النموذج. الحالية هي لغة البرمجة النصية الأكثر شيوعًا لتطوير مواقع الويب. في خدمات الويب، تعد خدمة تحميل الملفات وظيفة شائعة جدًا، لكن PWS ضمن WIN9X لا توفر المكونات ذات الصلة ضمن IIS التي توفر منشورًا مكون متقبل، ولكن ليس من السهل استخدامه لأنه يتحقق من حقوق الوصول إلى WWW للمستخدم، ويمكنك أيضًا تنزيل المكونات ذات الصلة من الإنترنت، ولكن معظم هذه المكونات تجارية، والمكونات المستخدمة للتنزيل هي إصدارات تجريبية أثناء الاستخدام الوقت أو هناك قيود على الوظائف. نظرًا لأن ASP يمكنه استدعاء مكونات OLE/COM القياسية، فيمكننا استخدام أدوات البرمجة المتقدمة مثل VB/VC/DELPHI لتخصيص مكونات تحميل ملف ASP الخاصة بنا وفقًا لمتطلباتنا الخاصة لتلبية متطلبات نظام التطبيق الخاص بنا.
سوف يناقش ما يلي المبدأ وعملية التنفيذ المحددة لاستخدام DELPHI لتطوير مكونات تحميل الملفات لـ ASP.
1. مبدأ تنفيذ تحميل الملف
يجب أن يتوافق تحميل البيانات على الويب مع معيار RFC1867، وبيانات الملف التي تم تحميلها ليست استثناءً. على سبيل المثال، استخدم ملف صفحة HTML التالي (delphiup.htm) لتحديد ملف التحميل:
<!-- DelphiUp.htm: واجهة تحميل الملفات -->
<html><head><title>تحميل الملف</title></head><body>
تنفيذ تحميل الملف باستخدام مكون تحميل الملف المكتوب بلغة DELPHI
<form NAME="UploadForm" ACTION="delphiup.asp" METHOD="POST" ENCTYPE="multipart/form-data">
<p>احفظ الملف باسم: <input TYPE=text NAME="SaveAs">
<p>يرجى تحديد الملف المراد تحميله: <input TYPE=file NAME="FileData">
<input type = "submit" name = "b1" value = "تأكيد التحميل"> </p>
</النموذج>
</body></html>
عندما يحدد العميل ملفًا (مثل Test.TXT، ومحتواه هو "هنا محتوى ملف للتحميل.") ثم اضغط
بعد أن يقوم زر "تأكيد التحميل" بإرسال البيانات، فإن البيانات التي يتلقاها البرنامج من جانب الخادم سيكون لها النموذج التالي:
--------------------------7cf1d6c47c#13#10
ترتيب المحتوى: اسم بيانات النموذج = "حفظ باسم"#13#10#13#10
اسم الملف الجديد#13#10
--------------------------7cf1d6c47c#13#10
ترتيب المحتوى: اسم بيانات النموذج = "بيانات الملف"؛
نوع المحتوى: نص/عادي#13#10#13#10
هنا محتوى الملف للتحميل. #13#10
--------------------------7cf1d6c47c#13#10
ترتيب المحتوى: بيانات النموذج = "b1"#13#10#13#10
تأكيد التحميل#13#10
--------------------------7cf1d6c47c--
من بينها، "--------------------------------7cf1d6c47c" هو المحدد المستخدم لفصل كل حقل في النموذج ( استمارة)؛
#13#10 هو تمثيل DELPHI لأحرف إرجاع السطر وتغذية الأسطر. يمكننا التفكير في الأمر بهذه الطريقة، يبدأ وصف المعلومات لكل حقل نموذج بمحدد بالإضافة إلى زوج من أحرف الإرجاع وخلاصات الأسطر #13#10؛ يبدأ اسم مجال النموذج بـ "name =" وينتهي بـ """ حقل النموذج تبدأ القيمة بزوجين من أحرف إرجاع السطر وتغذية السطر #13#10#13#10، وتنتهي بزوج من أحرف إرجاع السطر وتغذية السطر #13#10# بالإضافة إلى اسم الملف يبدأ بـ "اسم الملف =" وينتهي بـ """ للنهاية. باستخدام هذه العلامات، يمكننا الحصول على اسم وقيمة حقل النموذج واسم الملف المراد تحميله، بحيث يمكن قراءة بيانات الملف وتخزينها.
2. تنفيذ عملية تحميل الملف
بعد فهم تنسيق البيانات المذكور أعلاه، لم يعد من الصعب علينا كتابة مكون تحميل الملف بأنفسنا.
(1) ابدأ مشروعًا لإنشاء مكون ASP
إذا لم تكن على دراية بخطوات استخدام DELPHI لتطوير OLE Automation Server، يرجى الرجوع إلى مقالة "استخدام DELPHI لتطوير OLE Automation Server لـ ASP" في "الإلكترونيات وأجهزة الكمبيوتر"، العدد 06، 1999.
هنا نقدم الخطوات بإيجاز فقط.
1. قم بإنشاء مشروع مكتبة ActiveX
في DELPHI، حدد القائمة File = "جديد..."، وحدد "ActiveX Library" في علامة التبويب ActiveX في مربع الحوار "New Item"، وسيقوم DELPHI تلقائيًا بإنشاء مشروع DLL PROject1.
2. إنشاء مكونات الأتمتة
في DELPHI، حدد القائمة File = "جديد..."، وحدد "Automation Object" في علامة التبويب ActiveX في مربع الحوار "New Item"، ثم أدخل اسم الفئة (مثل "UploadFile") في "Automation Object Wizard" في مربع الحوار، حدد التثبيت "متعدد مثيل". بعد النقر فوق "موافق"، سيقوم DELPHI تلقائيًا بإنشاء ملف TLB (مكتبة النوع) Project1_TLB.PAS وملف PAS (الوحدة) Unit1.PAS. في نافذة تصميم مكتبة النوع، أعد تسمية Project1 إلى MyUpload، ثم يكون رمز تسجيل OLE لمكون تحميل الملف هو "MyUpload.UploadFile".
3. تقديم مكتبة نوع ASP
من أجل استخدام الكائنات الخمسة المضمنة في ASP (الطلب، الاستجابة، الخادم، التطبيق، الجلسة)، يجب تقديم مكتبة نوع ASP. نستخدم بشكل أساسي كائن الطلب لقراءة البيانات التي يتم تمريرها من العميل إلى الخادم.
حدد "استيراد مكتبة النوع" في قائمة المشروع، ثم حدد "مكتبة كائنات صفحات الخادم النشطة لـ Microsoft (الإصدار)" في قائمة "مكتبات النوع" في مربع الحوار "مكتبة استيراد النوع". 2.0)" (إذا لم يكن هذا الخيار متاحًا، فيرجى التأكد من تثبيت IIS3 أو أعلى أو PWS4 أو أعلى على جهاز الكمبيوتر لديك ومن تسجيل ASP.DLL بشكل صحيح)، D سيقوم ELPHI تلقائيًا بإنشاء ملف TLB ASPTypeLibrary_TLB.PAS، والذي يحتوي على تعريف نوع كائن ASP الذي نحتاجه.
4. قم بتعريف عمليات OnStartPage وOnEndPage
عند استخدام Server.CreateObject لإنشاء مثيل كائن OLE على صفحة ASP، سيقوم خادم الويب باستدعاء الأسلوب OnStartPage الخاص به وتمرير معلومات بيئة تطبيق ASP إلى الكائن. يمكننا الحصول على معلومات العميل أثناء هذه العملية؛ عندما يتم إصدار مثيل كائن OLE في صفحة ASP، سيستدعي خادم الويب طريقته OnEndPage، ويمكننا إجراء عمليات نهائية مثل تحرير الذاكرة أثناء هذه العملية. في المكون الخاص بنا، نحتاج إلى استخدام طريقة OnStartPage الخاصة به.
يجب تعريف أسلوب OnStartPage في Unit1.PAS. النموذج الأولي لوظيفة OnStartPage هو:
الإجراء OnStartPage(AScriptingContext: IUnknown);
المعلمة AScriptingContext هي متغير من نوع IScriptingContext، بما في ذلك خمس سمات (طلب، استجابة، خادم، تطبيق، جلسة) تقابل خمسة كائنات مضمنة بنفس الاسم في ASP.
نحتاج إلى إضافة طريقة OnStartPage إلى IUploadFile في نافذة تعريف TLB (View = "Type Library)، وبيان الإعلان الخاص بها هو "procedure OnStartPage(AScriptingContext: IUnknown);".
(2) استخراج البيانات التي تم تحميلها من قبل العميل
يمكن تنفيذ هذا العمل في عملية OnStartPage.
باستخدام الخاصية TotalBytes (طول محتوى معلومات الطلب) وطريقة BinaryRead في خاصية الطلب (النوع IRequest) الخاصة بـ AScriptingContext، يمكن قراءة بيانات معلومات الطلب التي تم تحميلها بواسطة العميل في صفيف من نوع Byte، ثم تنسيق البيانات المحدد بواسطة RFC1867 معيار تحليل واستخراج البيانات.
1. قم أولاً بتعريف العديد من المتغيرات الخاصة لـ TUploadFile
أضف مرجعًا إلى ASPTypeLibrary_TLB.PAS (الاستخدامات) في ملف الوحدة UP01.PAS (المحفوظ بواسطة Unit1.PAS)،
ثم انضم
خاص
FContentLength: LongInt; // طول محتوى المعلومات المطلوبة
FContentData: Variant؛// بيانات المحتوى، تخزن محتوى معلومات الطلب في شكل مصفوفة
FFileName, // اسم الملف الذي سيتم تحميله
FDelimeter: string; // محدد حقل النموذج
FScriptingContext: IScriptingContext;// يقوم ASP بمعالجة محتوى السياق
FFileDataStart, // بداية موضع بيانات الملف
FFileDataEnd: LongInt; // نهاية موضع بيانات الملف
2. استخراج بيانات معلومات الطلب المرفوعة من قبل العميل
// في حدث OnStartPage، احصل على معلومات سياق ASP ومحتوى معلومات الطلب ومحددات حقل النموذج وبيانات الملف
الإجراء TUploadFile.OnStartPage(AScriptingContext: IUnknown);
فار
ARequest: IRequest؛ // كائن طلب WWW
AOleVariant: OleVariant; // سجل طول محتوى معلومات الطلب
intDelimterLength: عدد صحيح؛// طول المحدد
longIndex,ALongInt,longPos : LongInt;
ContentData: AnsiString;// تمثيل سلسلة لمحتوى معلومات الطلب
strTemp: سلسلة؛
FindEndOfFileData: منطقي؛// ما إذا تم العثور على الموضع النهائي لبيانات الملف
يبدأ
// استخراج بيانات معلومات الطلب التي تم تحميلها من قبل العميل
FScriptingContext := AScriptingContext as IScriptingContext;//احصل على معلومات سياق ASP
ARequest := FScriptingContext.Request;//احصل على معلومات طلب WWW
FContentLength := ARequest.TotalBytes;// طول محتوى معلومات الطلب
// أنشئ مصفوفة ديناميكية لتخزين محتوى معلومات الطلب في شكل مصفوفة
FContentData := VarArrayCreate( [0,FContentLength], varByte);
// قم بتخزين محتوى معلومات الطلب في المصفوفة
AOleVariant := FContentLength;
FContentData := ARequest.BinaryRead(AOleVariant);// اقرأ محتوى معلومات الطلب
// قم بتحويل محتوى معلومات الطلب إلى سلسلة لسهولة تحديد المواقع
بيانات المحتوى := ';
لـ longIndex: = 0 إلى FContentLength - 1 do
يبدأ
ContentData := ContentData + chr( Byte( FContentData[ longIndex ] ));
إذا كانت FContentData[longIndex] = 0 ثم فاصل؛//0 يشير إلى نهاية المحتوى
نهاية؛
3. احصل على المحدد وتحميل اسم الملف
// احصل على محدد حقل النموذج
longPos := pos( #13#10,ContentData );// موضع حرف الإرجاع وحرف تغذية السطر
FDelimeter := Copy( ContentData,1,longPos-1);// المحتوى قبل هذا الموضع هو المحدد
// احصل على اسم الملف بمسار المصدر، في محتوى معلومات الطلب، يبدأ اسم الملف بـ
// التخزين على شكل اسم الملف = "المسار/اسم الملف"
strTemp := 'filename="';// اسم الملف بعد "filename ="
longPos := pos( strTemp, ContentData );// احصل على موضع "اسم الملف ="
إذا longPos <= 0 ثم
يبدأ
FFileName := ';
FFileDataStart := -1;
FFileDataEnd := -2;
مخرج؛
نهاية؛
// احصل على المحتوى قبل علامة الاقتباس المزدوجة التالية """، أي اسم الملف مع مسار المصدر
longPos := longPos + length( strTemp );
strTemp := ';
for longIndex := longPos to FContentLength - 1 do
إذا كان ContentData[longIndex] <> '"' إذن
strTemp := strTemp + ContentData[longIndex]
آخر كسر؛
FFileName := strTemp;
4. الحصول على مواضع البداية والنهاية لبيانات الملف في محتوى معلومات الطلب
// موضع البداية لبيانات الملف هو بعد #13#10#13#10 الأول بعد اسم الملف
حذف (ContentData، 1، longIndex)؛
strTemp := #13#10#13#10;
FFileDataStart := longIndex + pos(strTemp, ContentData) + length(strTemp) - 1;
// الموضع النهائي لبيانات الملف هو قبل #13#10 التالي والمحدد
// نظرًا لأن بيانات الملف قد تحتوي على أحرف غير قانونية، فلا يمكن استخدام وظيفة تحديد موضع السلسلة POS بعد الآن.
// ابحث عن موضع المحدد التالي
FFileDataEnd := FFileDataStart;
intDelimterLength := length( FDelimeter );
FindEndOfFileData := false;
بينما FFileDataEnd <= FContentLength - intDelimterLength يفعل
يبدأ
FindEndOfFileData := true;
لـ ALongInt := 0 إلى intDelimterLength - 1 do
إذا بايت( FDelimeter[ ALongInt + 1 ] ) <>
FContentData[FFileDataEnd + ALongInt] ثم
يبدأ
FindEndOfFileData := false;
استراحة؛
نهاية؛
إذا كان FindEndOfFileData ثم ينقطع؛
FFileDataEnd := FFileDataEnd + 1;
نهاية؛
إذا لم يكن FindEndOfFileData ثم FFileDataEnd := FFileDataStart - 1//لم يتم العثور على محدد
else FFileDataEnd := FFileDataEnd - 3;//المحدد، انتقل إلى الأمام #13#10
نهاية؛
(3) نقل المعلومات إلى برنامج ASP
بعد إجراء العملية (2)، يستطيع مكون التحميل الخاص بنا تمرير البيانات إلى برنامج ASP وفقًا لمتطلباته. تتضمن البيانات المتوفرة حاليًا: اسم ملف مصدر العميل (FFileName، بما في ذلك المسار)، وحجم الملف (FFileDataEnd-FFileDataStart+1).
أولاً، يجب الإعلان عن الطريقتين التاليتين GetFileName وGetFileSize في نافذة تصميم TLB.
1. قم بإرجاع اسم الملف المصدر للعميل (بما في ذلك المسار)
// إرجاع اسم ملف مصدر العميل (بما في ذلك المسار)
الدالة TUploadFile.GetFileName: OleVariant;
يبدأ
النتيجة := FFileName;// اسم ملف مصدر العميل (بما في ذلك المسار)
نهاية؛
2. إرجاع حجم الملف
// إرجاع حجم الملف (بايت)
الدالة TUploadFile.GetFileSize: OleVariant;
يبدأ
النتيجة := FFileDataEnd - FFileDataStart + 1;
نهاية؛
(4) حفظ الملفات
بعد إجراء العملية (2)، يمكن لمكون التحميل الخاص بنا حفظ الملف وفقًا لمتطلبات برنامج ASP. أولا يجب أن يكون في
تم الإعلان عن الطريقتين التاليتين، SaveFileAs وSaveFile، في نافذة تصميم TLB.
1. احفظ الملف حسب اسم الملف المحدد
// احفظ الملف وفقًا لاسم الملف المحدد. المعلمة FileName هي اسم الملف المحدد. تشير قيمة الإرجاع True إلى أنه تم حفظ الملف بنجاح.
وظيفة TUploadFile.SaveFileAs(FileName: OleVariant): OleVariant;
فار
longIndex : LongInt;
AFile: ملف بايت؛// احفظ الملف في شكل ثنائي
بايت البيانات: بايت؛
يبدأ
النتيجة :=صحيح؛
يحاول
تعيين (AFile، FileName)؛
إعادة كتابة(AFile);
for longIndex := FFileDataStart to FFileDataEnd do
يبدأ
byteData := Byte( FContentData[longIndex ] );
Write(AFile, byteData);
نهاية؛
ملف مغلق (AFile) ؛
يستثني
النتيجة := خطأ؛
نهاية؛
نهاية؛
2. احفظ الملف باسم الملف الافتراضي
// احفظ الملف وفقًا لاسم الملف الافتراضي، واحفظ الملف بنفس الاسم في الدليل الذي توجد به صفحة الاتصال
وظيفة TUploadFile.SaveFile: OleVariant؛
فار
مسار الملف الحالي: سلسلة؛
يبدأ
// احصل على الدليل الذي توجد به صفحة الاتصال
CurrentFilePath := FScriptingContext.Request.ServerVariables['PATH_TRANSLATED'];
CurrentFilePath := ExtractFilePath( CurrentFilePath );
//حفظ الملف
النتيجة := SaveFileAs( CurrentFilePath + ExtractFileName( FFileName ));
نهاية؛
3. أمثلة تطبيقية لمكونات التحميل
في مثالنا، DelphiUp.HTM هي واجهة تحميل الملفات، ويتم استخدام DelphiUp.ASP لتنفيذ عمليات تحميل الملفات.
رمز DelphiUp.ASP هو كما يلي:
<!--DelphiUp.ASP: صفحة معالجة تحميل الملفات-->
<html><head><title>تحميل الملف</title></head><body>
<% تحميل خافت، اسم الملف
تعيين التحميل = Server.CreateObject("MyUpload.UploadFile")
اسم الملف = Upload.GetFileName
Response.Write "<br>جارٍ حفظ الملف ""&اسم الملف&""..."
إذا Upload.SaveFile ثم
Response.Write "<br>تم تحميل الملف ""&FileName&"" بنجاح."
Response.Write "<br>حجم الملف هو "&Upload.GetFileSize&" بايت."
آخر
Response.Write "<br>فشل تحميل الملف ""&FileName&""."
نهاية إذا
اضبط التحميل = لا شيء %>
</body></html>
4. بعض التفسيرات
1. حجم ملف DLL الذي تم تجميعه من الكود المصدري الذي تم إنشاؤه تلقائيًا بواسطة DELPHI هو 215 كيلو بايت، والذي يمكن العثور عليه في
في قسم الواجهة في ASPTypeLibrary_TLB.PAS، احذف كافة الوحدات في الاستخدامات باستثناء ActiveX.
عن طريق حذف كافة الوحدات الموجودة في الاستخدامات في MyUpload_TLB.PAS، يمكن تقليل حجم ملف DLL الذي تم إنشاؤه إلى 61 كيلو بايت.
2. تنطبق الطريقة المذكورة أعلاه أيضًا على برامج CGI، ولكن يجب استخدام كائن TWebRequest.
تم تصحيح أخطاء البرنامج أعلاه وتمريره ضمن PWIN98+Delphi3.0+PWS4.0.