الملخص: تقدم هذه المقالة طريقتين لـ JavaBean لتنفيذ عمليات تحميل ملفات متعددة، باستخدام بروتوكول http وبروتوكول ftp على التوالي. أولاً، يصف التنسيق الأساسي لنقل ملفات متعددة من خلال بروتوكول http وعملية التحميل التفصيلية، ثم يقدم بإيجاز استخدام فئة ftpclient لتنفيذ تحميل ftp، وأخيرًا يقارن بين الطريقتين.
الكلمات الأساسية: JavaBean، http، ftp، ftpclient
JavaBean هو أحد مكونات البرامج المستندة إلى Java. يوفر JSP الدعم الكامل لدمج مكونات JavaBean في تطبيقات الويب. لا يؤدي هذا الدعم إلى تقليل وقت التطوير فحسب (يمكنك استخدام المكونات الموجودة التي تم اختبارها وموثوق بها مباشرة، وتجنب التطوير المتكرر)، ولكنه يوفر أيضًا المزيد من قابلية التوسع لتطبيقات JSP.
تعتبر وظيفة تحميل الملفات شائعة جدًا في نموذج التطوير القائم على B/S. بالمقارنة مع أدوات التطوير الأخرى، فإن دعم JSP لتحميل الملفات ليس مثاليًا، فهو لا يتطلب مكونات لإكمالها مثل ASP، كما أنه لا يوفر دعمًا مباشرًا لتحميل الملفات مثل PHP. الطريقة التي ينفذ بها JSP تحميل الملف هي كما يلي: استخدم طريقة getInputStream() لفئة ServletRequest للحصول على دفق بيانات أرسله العميل إلى الخادم، ثم قم بمعالجة دفق البيانات هذا لتحليل والحصول على المعلمات والمعلمات المختلفة التي تم تمريرها إلى الخادم أثناء رفع بيانات الملف ومن ثم تخزين بيانات الملف فيه كملف أو إدراجها في قاعدة بيانات. عادةً لا تتعامل صفحات JSP مع وظيفة تحميل الملفات، ولكنها تضع هذه الوظائف في Servlets أو JavaBeans لتنفيذها. تم تقديم أمثلة لاستخدام Servlet لإكمال تحميل الملفات في بعض الكتب ذات الصلة بـ JSP. وسأقدم هنا كيفية استخدام JeanBean لإكمال تحميل الملفات. هناك طريقتان لتحميل الملفات في JSP، وهما بروتوكول HTTP وبروتوكول FTP. هناك اختلافات كبيرة في مبادئ النقل بين الاثنين. فيما يلي مقدمة مختصرة عن تنفيذها بناءً على الكود المصدري وأعتقد أن القراء سيستفيدون منها. لقد تم تصحيح البرنامج التالي وتمريره. بيئة تصحيح الأخطاء: window 2000 server+Apache +tomcat4.0، بيئة تصحيح أخطاء JavaBean: JDK1.4+Editplus.
يتطلب استخدام JavaBean في JSP لتنفيذ وظيفة تحميل الملفات على الويب بشكل عام الجمع بين ثلاثة أنواع من الملفات. هذه الملفات الثلاثة هي على التوالي ملف صفحة HTML الذي يوفر الواجهة، وملف JSP الذي يكمل استدعاء تنفيذ وظيفة التحميل لـ JavaBean، وملف فئة Java الذي ينفذ JavaBean. سأركز أدناه على جزء JavaBean الذي يستخدم بروتوكول HTTP وبروتوكول FTP لتنفيذ وظيفة تحميل الملف.
1 استخدم بروتوكول HTTP لتحميل ملفات متعددة.
في الماضي، لم تتمكن نماذج Html من تحميل الملفات، مما أدى إلى تقييد وظائف بعض صفحات الويب إلى حد ما. تعمل مواصفات RFC1867 (أي تحميل الملف المستند إلى النموذج بتنسيق Html) على توسيع النموذج وإضافة عنصر نموذج . باستخدام هذا العنصر، سيقوم المتصفح تلقائيًا بإنشاء مربع إدخال وزر. يسمح مربع الإدخال للمستخدم بملء اسم الملف المحلي واسم المسار، ويسمح الزر للمتصفح بفتح مربع اختيار الملف للمستخدم. حدد ملفًا. تنفيذ النموذج المحدد هو كما يلي:
<نوع الإدخال = "FILE" NAME = "FILE1" الحجم = "50">
عندما تختار لصق الملف، أدخل المسار المطلق للملف المحلي مباشرةً. قيمة سمة الإجراء للنموذج هي *.jsp، مما يعني أنه سيتم إرسال الطلب (بما في ذلك الملف الذي تم تحميله) إلى الملف. * ملف..jsp. في هذه العملية، يتم تنفيذ تحميل الملف عبر HTTP فعليًا. يتم دعم تحميل الملفات من العميل إلى الخادم بواسطة واجهة البوابة المشتركة (CGI) لبروتوكول HTTP. تتطلب طريقة التحميل هذه أن يدعم كل من المتصفح وWEBServer Rfc1867. يحصل JavaBean على دفق بيانات يرسله العميل إلى الخادم من خلال طريقة getInputStream() لفئة ServletRequest، ويحلل تنسيق الملف الذي تم تحميله، ويخرج ملفات متعددة إلى الملف الهدف على جانب الخادم بالتسلسل بناءً على نتائج التحليل. يتم تنفيذ وظيفة JavaBeande في هذا المثال خصيصًا بواسطة فئة testUpload. إطار عمل فئة TestUpload هو كما يلي:
فئة عامة testUpload
{
اختبار عام للتحميل (){……}
تهيئة الفراغ النهائي العام (تكوين ServletConfig) يلقي ServletException
{ m_application = config.getServletContext() }
تحميل الفراغ العام () يطرح testUploadException، IOException، ServletException
{…………}
getDataSection () باطلة خاصة {………}
getDataHeader () باطلة خاصة {………}
حفظ int العام (سلسلة destPathName)
يلقي SmartUploadException، IOException، ServletException
{…………}
…
}
قم بتهيئة بيئة تشغيل Servlet من خلال طريقة التهيئة (). استخدم طريقة التحميل () للحصول على دفق الإدخال، وتحليل تنسيق الملف الذي تم تحميله، وتعيين سمات كل ملف تم تحميله إلى مثيلات فئة الملف المتعددة للمعالجة. تستدعي فئة الملف طريقة الحفظ () الخاصة بها وفقًا لسمات كل ملف لإخراج ملفات متعددة إلى الملف الهدف على جانب الخادم بالتسلسل. طريقة التحميل () هي المفتاح المستخدم لتحليل تنسيق الملفات المرسلة بواسطة بروتوكول http1.1. بعد الاختبار، حصلنا على تنسيق ملف دفق النقل، وهو أمر مفيد لفهم طريقة التحميل (). على سبيل المثال، قم بتحميل ملف My Documentstt.txt. التنسيق كما يلي:
// فاصل الملف
--------------------------7d226137250336
// رأس معلومات الملف
ترتيب المحتوى: اسم بيانات النموذج = "FILE1"؛
نوع المحتوى: نص/عادي
// محتوى الملف المصدر
إنشاء معلومات الجدول(
صورة المحتوى فارغة)؛
// محدد الملف التالي
--------------------------7d226137250336
ترتيب المحتوى: اسم بيانات النموذج = "FILE2"؛
نوع المحتوى: تطبيق/ثمانية تيار
--------------------------------7d226137250336
من الملفات أعلاه يمكننا أن نرى أنه عند تحميل ملفات متعددة، فإن بروتوكول HTTP الكل يتم وضعها في دفق الإدخال وتمييزها بمحددات معينة. في الواقع، تتمثل طريقة التحميل () في تحليل الملف أعلاه وتحديد محتوى المحدد وتنسيق محتوى كل ملف واسم المسار الكامل للملف وبداية ونهاية البيانات الفعلية للملف. شيء واحد يجب ملاحظته هنا هو أن المحدد عشوائي، فهو عبارة عن جميع الأحرف قبل حرف الإرجاع الأول لملف دفق النقل.
عملية تنفيذ طريقة Upload () هي: أولاً قم بإخراج ملف دفق الإدخال إلى صفيف البايت m_binArray، والذي يتم تنفيذه من خلال الكود التالي.
m_totalBytes=1024 TotalRead=0;
for(; TotalRead < m_totalBytes; TotalRead += readBytes)
يحاول
{ m_request.getInputStream();
readBytes = m_request.getInputStream().read(m_binArray, TotalRead, m_totalBytes - TotalRead);
}catch(Exception e){ throw new SmartUploadException("غير قادر على التحميل.");}
يتم هنا استخدام طريقة القراءة متعددة البايت في الحلقة. تقرأ الحلقة أعلاه البيانات بشكل مستمر حتى يتم ملء المصفوفة. إذا كان من الممكن استرداد الملف بالكامل، فيمكن أيضًا استرداد كافة وحدات البايت من الملف. ولكن نظرًا لأن سرعة الشبكة عادة ما تكون أبطأ بكثير من وحدة المعالجة المركزية، فمن السهل على البرنامج مسح المخزن المؤقت للشبكة قبل وصول جميع البيانات. في الواقع، ستعيد طريقة القراءة متعددة البايت القيمة 0 عند محاولة قراءة البيانات من مخزن مؤقت للشبكة فارغ مؤقتًا ولكنه مفتوح، مما يعني عدم وجود بيانات ولكن لم يتم إغلاق دفق الشبكة. في هذه الحالة، ستمنع الطريقة أحادية البايت تنفيذ البرنامج قيد التشغيل، وبالتالي فإن سلوك الطريقة متعددة البايت أفضل من سلوك طريقة القراءة أحادية البايت. بعد ذلك سيتم تحليل مجموعة البايت m_binArray. ابحث أولاً عن المحدد؛ استخدم طريقة getDataHeader() لإرجاع قيمة رأس معلومات الملف، والتي يتم من خلالها تحديد اسم المسار الكامل للملف المصدر، وامتداد الملف المصدر وتنسيق محتوى الملف المصدر، باستخدام getDataSection()؛ طريقة لإرجاع بيانات محتوى الملف وتسجيل مواضع البداية والنهاية لبيانات الملف في مصفوفة البايت. ثم قم بإنشاء مثيل فئة ملف، ووضع اسم المسار الكامل للملف، وامتداد الملف المصدر، وتنسيق محتوى الملف المصدر، ومواضع البداية والنهاية لبيانات محتوى الملف في سمات مثيل فئة الملف. ابحث عن المحدد التالي واستمر في تكرار العملية المذكورة أعلاه حتى اكتمال التحليل.
2 استخدم بروتوكول FTP لتحميل ملفات متعددة
بروتوكول FTP هو بروتوكول يستخدم لنقل الملفات على الإنترنت وينص على معايير النقل المتبادل للملفات على الإنترنت. يتم تنفيذ هذه الوظيفة في جافا بمساعدة فئة FtpClient. عملية تنفيذ محددة: قم أولاً بإنشاء اتصال بخادم FTP؛ وتهيئة طريقة نقل الملفات، بما في ذلك ASCII وBINARY؛ وإخراج الملف إلى دفق إدخال الملف FileInputStream؛ وقراءة البيانات الموجودة في FileInputStream في مصفوفة بايت؛ تتم كتابة البيانات إلى دفق الإخراج TelnetOutputStream (استخدم طريقة الكتابة لكتابة البيانات إلى ارتباط الشبكة). بهذه الطريقة، يتم نسخ ملف بنفس اسم الملف المصدر إلى الخادم. في هذا المثال، يكمل JavaBean عملية تحميل الملف من خلال ثلاث طرق: ConnectServer ()، وتحميل ()، وCloseConnect (). التنفيذ الرئيسي هو كما يلي:
الطبقة العامة ftpUpload
{ اسم ملف السلسلة؛ اسم ملف السلسلة 1؛ FtpClient ftpClient؛
اتصال الفراغ العام (خادم السلسلة، مستخدم السلسلة، كلمة مرور السلسلة، مسار السلسلة)
{
// الخادم: عنوان IP لخادم FTP؛ المستخدم: اسم المستخدم لتسجيل الدخول إلى خادم FTP
// كلمة المرور: كلمة مرور اسم المستخدم لتسجيل الدخول إلى خادم FTP؛
حاول { ftpClient=new FtpClient();
ftpClient.openServer(server);
ftpClient.login(user,password);
System.out.println("نجاح تسجيل الدخول!");
if (path. length()!=0) ftpClient.cd(path);
ftpClient.binary(); }catch (IOException ex) {System.out.println(ex);}
}
إغلاق الفراغ العام ()
{محاولة{ ftpClient. CloseServer ()؛
}catch (IOException ex) {System.out.println(ex);}
}
تحميل الفراغ العام ()
{ filename1=findFileName(filename);
// تحليل اسم الملف من اسم الملف واستخدامه كاسم للملف الهدف لم يتم تقديم الطريقة المحددة.
يحاول {
TelnetOutputStream os=ftpClient.put(filename1);
java.io.File file_in=new java.io.File(filename);
FileInputStream is=new FileInputStream(file_in);
بايت[] بايت=بايت جديد[1024];
كثافة العمليات ج؛
while ((c=is.read(bytes))!=-1){ os.write(bytes,0,c });
is.Close();
} قبض (IOException على سبيل المثال) {System.out.println(ex);}
}
}
يكمل ConnectServer () وظيفة إنشاء اتصال بخادم FTP، ويستخدم طريقة FtpClient's openServer (خادم السلسلة) لفتح خادم FTP البعيد، ثم يستخدم طريقة تسجيل الدخول (المستخدم وكلمة المرور) الخاصة بـ FtpClient لتسجيل الدخول إلى الخادم. هناك طريقتان لتسجيل الدخول إلى خادم FTP البعيد، إحداهما هي تسجيل الدخول كمستخدم مسجل، والأخرى هي تسجيل الدخول بشكل مجهول. يتطلب الأول من المستخدم التسجيل أولاً كعميل للخادم. سيمنح الخادم المستخدم حساب تسجيل دخول وكلمة مرور، ويتصل بالخادم بناءً على الحساب وكلمة المرور. يتطلب الأخير من المستخدمين استخدام أسماء المستخدمين الخاصة "مجهول" و"ضيف" دون التسجيل لتقييد الوصول إلى الملفات العامة على المضيفين البعيدين، حيث تطلب العديد من الأنظمة الآن من المستخدمين استخدام عنوان بريدهم الإلكتروني ككلمة مرور. لأغراض أمنية، يسمح معظم مضيفي FTP المجهولين عمومًا للمستخدمين البعيدين فقط بتنزيل الملفات، ولكن لا يسمحون بتحميلها، ويعتمد ذلك على إعدادات خادم FTP. يمكن للمستخدمين اختيار استخدام طريقتين وفقًا للظروف الفعلية. بعد تسجيل الدخول، استخدم الطريقة الثنائية () الخاصة بـ FtpClient لتهيئة وضع النقل إلى وضع البايت. تحميل () يكمل وظيفة تحميل الملف. قم بإنشاء دفق إدخال الملف FileInputStream للملف المصدر، واكتب دفق الإدخال في مصفوفة البايت، واستخدم طريقة الكتابة TelnetOutputStream لكتابة البيانات في مصفوفة البايت إلى رابط الشبكة. نظرًا لأن TelnetOutputStream يفتح ملفًا على خادم FTP، تتم كتابة البيانات إلى الملف الهدف، وبالتالي إكمال تحميل الملف. يتطلب CloseConnect() قطع الاتصال بالخادم.
ما ورد أعلاه هو مجرد عملية تحميل ملف واحد، إذا كانت هناك ملفات متعددة، فيمكن استدعاء عملية التحميل هذه عدة مرات. من الطريقتين المذكورتين أعلاه، يمكننا أن نرى أن استخدام بروتوكول FTP لتحميل ملفات متعددة هو أمر بسيط نسبيًا وسهل التنفيذ. يعد استخدام بروتوكول FTP لتحميل الملفات بشكل عام برنامجًا من جانب العميل، وستكون إعدادات الأمان من جانب الخادم أكثر تعقيدًا، بينما يعد استخدام بروتوكول HTTP لتحميل الملفات تطبيقًا من جانب الخادم، وستكون إعدادات الأمان بسيطة نسبيًا . ومن خلال الاختبار، وجد أن طريقة تحميل FTP أسرع بعشرات أو حتى مئات المرات من طريقة تحميل HTTP عند إرسال الملفات الكبيرة، ولكنها أبطأ قليلاً من طريقة تحميل HTTP عند نقل ملفات أصغر من 1M. ولذلك، فإن كلتا طريقتي الإرسال لهما مزاياهما الخاصة، ويُنصح القراء بالتصرف وفقًا لظروفهم الخاصة. إذا كان لديك أي أسئلة أو كنت بحاجة إلى كود المصدر لأجزاء أخرى، يرجى الاتصال بي!