نظرة عامة على تحميل الملف
لتحقيق وظيفة تحميل الملف في تطوير الويب ، تحتاج إلى إكمال الخطوتين التاليتين:
إضافة إدخال تحميل إلى صفحة الويب
اقرأ بيانات الملف التي تم تحميلها في Servlet وحفظها على القرص الثابت المحلي.
كيفية إضافة عناصر إدخال تحميل إلى صفحات الويب؟
يتم استخدام العلامة <input type = "file"> لإضافة عناصر إدخال تحميل الملف إلى صفحة الويب. يجب أن تنتبه عند إعداد عناصر إدخال الملف:
1. يجب تعيين سمة الاسم لعنصر الإدخال ، وإلا فلن يرسل المتصفح بيانات الملف المحمّلة.
2. يجب ضبط قيمة النموذج على النموذج على multipart/form-data. بعد تعيين هذه القيمة ، عندما يقوم المتصفح بتحميل الملف ، فإنه سيقوم بإرفاق بيانات الملف بجسم رسالة طلب HTTP ، واستخدم بروتوكول MIME لوصف الملف الذي تم تحميله لتسهيل المستلم لتحليل البيانات التي تم تحميلها ومعالجتها.
نظرة عامة على تحميل الملف
كيفية قراءة بيانات تحميل الملف في Servlet وحفظها على القرص الصلب المحلي؟
يوفر كائن الطلب طريقة getInputStream ، يمكن من خلالها قراءة البيانات المقدمة من العميل. ومع ذلك ، نظرًا لأن المستخدمين قد يقومون بتحميل ملفات متعددة في نفس الوقت ، فهي مهمة مزعجة للغاية لقراءة بيانات التحميل برمجيًا مباشرة على جانب Servlet وتحليل بيانات الملف المقابلة بشكل منفصل.
لتسهيل المستخدمين لمعالجة بيانات تحميل الملفات ، توفر مؤسسة Apache Open Source مكونًا مفتوحًا (Commons-FileUpload) المستخدم لمعالجة تحميل ملفات النموذج. يحتوي هذا المكون على أداء ممتاز وواجهة برمجة التطبيقات الخاصة به بسيطة للغاية في الاستخدام ، مما يسمح للمطورين بتنفيذ وظائف تحميل ملفات الويب بسهولة. لذلك ، يتم تنفيذ وظيفة تحميل الملف عادة في تطوير الويب ، والذي يتم تنفيذه عادةً باستخدام مكون المشاع.
استخدم مكون Commons-FilePload لتنفيذ تحميل الملفات ، وتحتاج إلى استيراد حزم جرة الدعم المقابلة لهذا المكون: Commons-Filepload و Commons-IO. لا ينتمي Commons-IO إلى ملف JAR للتطوير لمكونات تحميل الملفات ، ولكن يبدأ مكون المشاع في FilePload بالإصدار 1.1 ويتطلب الدعم من حزمة Commons-IO عندما يعمل.
FileUpload Component Workflow
Core API - DiskfileItemFactory
DiskfileItemFactory هو المصنع الذي ينشئ كائنات fileItem. الطرق الشائعة لفئة المصنع هذه:
SetSizeSethReshold (int sizethreshold): يحدد حجم المخزن المؤقت للذاكرة ، والقيمة الافتراضية هي 10 كيلو. عندما يكون ملف التحميل أكبر من حجم المخزن المؤقت ، سيقوم مكون FileUpload بتحميل الملف باستخدام ذاكرة التخزين المؤقت للملف المؤقت.
public void setRepository (java.io.file ropository): حدد دليل الملف المؤقت ، القيمة الافتراضية هي System.getProperty ("java.io.tmpdir").
DiskfileItemFactory (int sizethreshold ، java.io.file مستودع): مُنشئ
Core API - servletfileupload
ServletFileUpload مسؤول عن معالجة بيانات الملف التي تم تحميلها وتغليف كل عنصر إدخال في النموذج إلى كائن FileItem. الطرق الشائعة هي:
Boolean IsmultipartContent (طلب httpservletrequest): يحدد ما إذا كان النموذج الذي تم تحميله هو نوع multipart/form-data
قائمة parserequest (طلب httpservletrequest): تحليل كائن الطلب ، لف كل عنصر إدخال في النموذج في كائن fileItem ، وإرجاع مجموعة قائمة تحفظ جميع fileItems.
setFilesizeMax (long filesizemax): اضبط القيمة القصوى للملفات التي تم تحميلها
SetSizeMax (Sizemax الطويل): اضبط القيمة القصوى لعدد الملفات التي تم تحميلها
setheaderencoding (java.lang.string الترميز): اضبط تنسيق الترميز
SetProgressListener (ProgressListener Plistener)
حالة تحميل الملف
خطوات التنفيذ
1. إنشاء كائن DiskfileItemFactory ، وضبط حجم المخزن المؤقت ودليل الملف المؤقت 2. استخدم كائن DiskFileItemFactory لإنشاء كائن ServleTfileUpload ، وضبط الحد الأقصى للحجم لتحميل الملفات.
3. استدعاء ServletFileUpload.Parserequest طريقة لتحليل كائن الطلب والحصول على كائن قائمة يحفظ جميع المحتويات التي تم تحميلها.
4. التكرار على القائمة. يكرر كل منها كائن fileItem ، واتصل طريقة iSformfield لتحديد ما إذا كان ملف تم تحميله.
إنه حقل نموذج عادي ، ثم اتصل بـ GetFieldName و Getstring للحصول على اسم الحقل وقيمة الحقل
لتحميل ملف ، يتم استدعاء طريقة getInputStream للحصول على دفق إدخال البيانات ، وبالتالي قراءة البيانات التي تم تحميلها.
الترميز لتنفيذ تحميل الملفات
معالجة تفاصيل تحميل الملفات
مشكلة مشوهة الملف الصيني
مشكلة اسم الملف الصيني المشوهة ، يمكنك استدعاء طريقة setheaderencoding من servletuploader ، أو تعيين خاصية setCharacterencoding للطلب
مشكلة حذف الملف المؤقتة
نظرًا لأن حجم الملف يتجاوز حجم المخزن المؤقت للذاكرة الذي تم تعيينه بواسطة طريقة diskfileItemFactory.SetSizeThreshold ، فإن مكون المشاع-filepload سوف يستخدم ملفًا مؤقتًا لحفظ البيانات التي تم تحميلها. لذلك ، في نهاية البرنامج ، تأكد من استدعاء طريقة fileitem.delete لحذف الملف المؤقت.
يجب أن تكون المكالمة إلى طريقة الحذف بعد إغلاق الدفق ، وإلا ستحدث استخدام الملف ، مما يؤدي إلى فشل الحذف.
موقع تخزين الملفات
لضمان أمان الخادم ، يجب حفظ الملفات التي تم تحميلها في دليل الويب الخاص بالتطبيق ، أو دليل لا يديره خادم الويب.
لمنع العديد من المستخدمين من تحميل الملفات بنفس اسم الملف ، مما يؤدي إلى الكتابة فوق الملف ، يجب أن يضمن تحميل الملف أن الملف الذي تم تحميله له اسم ملف فريد.
من أجل منع الكثير من الملفات في دليل واحد والتأثير على سرعة قراءة الملفات والكتابة ، يجب أن يحدد البرنامج الذي يتولى تحميل الملفات خوارزمية توليد بنية الدليل المناسبة بناءً على إجمالي تحميل الملفات الممكنة ، وتخزين الملفات التي تم تحميلها بطريقة مبعثرة.
تنزيل الملف
نظرًا لأن الملف المراد تنزيله يمكن أن يكون من أنواع مختلفة ، يجب نقل الملف إلى العميل ، ويجب معالجة محتوىه المقابل على أنه ثنائي ، لذلك يجب استدعاء الطريقة لإرجاع كائن ServelToutputStream لكتابة محتوى الملف إلى العميل.
قم بتنزيل القضية
تكرار جميع الملفات في دليل التحميل ويعرضها على المستخدم ويسمح للمستخدم بإكمال التنزيل.
(اقرأ جميع الملفات في مجلد معين ، وحفظها في القائمة في المجموعة ، ثم حفظها إلى نطاق الطلب) ListFileservlt― (إظهار جميع قائمة الملفات) listfiles.jsp ---- downloaservlet.javaprivate string id ؛ private savename ؛ // اسم ملف التحميل ، اسم UUID للملف الخاص بالسلسلة الخاصة. // الاسم الحقيقي لملف التحميل الخاص سلسلة SavePath ؛ // تذكر موقع الملف الخاص بوقت التشغيل الخاص ؛ // وقت التحميل لوصف الملف الخاص ؛ // وصف اسم المستخدم الخاص بالملف ؛ . javax.servlet.http.httpservlet ؛ importjavax.servlet.http.httpletrequest استجابة) ThrowsServleTexception ، ioException {stringsavepath = this.getServletContext (). map) ؛ request.setattribute ("map" ، map) ؛ request.getRequestDispatcher ("/listfile.jsp"). // uuid_a_1_3_3.txtstringrealname = uuidname.substring (uuidname.indexof ("_") + 1) ؛ map.put (uuidname ، realName) ؛} {file [] file = file.listfiles () ؛ for f: file) dopost (httpservletrequest request ، httpservletresponse) throwsServleTexception ، ioException {doget (request ، report) ؛}} downloadservletpackage com.hbsi.ioio ؛ import java.file ؛ import java.fileinputstream ؛ expresse java. java.io.printwriter ؛ استيراد java.net.urlencoder ؛ استيراد javax.servlet.servletexception ؛ استيراد javax.servlet.http.httpservlet ؛ eSportjavax.servlet.http.httpservlesterdequest ؛ isportjavlet.servlet addreshttpservlet {publicvoid dogge (httpservletrequest request ، httpservletresponse) throwsservletexception ، ioException {stringfilename = request.getParameter ( "utf-8") ؛ system.out.println (filename) ؛ stringsavepath = this.getFilesavePath (this.getRealName (filename)) ؛ filef = new file (savepath + "//" + filename) ؛ if (! f.exists ()) موجود ") ؛ request.getRequestDispatcher ("/message.jsp "). byte [1024] ؛ intlen = 0 ؛ outputStreamout = response.getOutputStream () ؛ بينما ((len = in.read (buf))> 0) {out.write (buf ، 0 ، len) ؛} in.close () ؛ (filename.hashcode () >> 4) & 0xf ؛ tringsavepath = this.getServletContext (). filename.substring (fileName.indexof ("_") + 1) ؛ returnRealName ؛} publicvoid dopost (httpservletrequest request ، httpservletresponse) throwsservlexception ، ioException {dogge (request ، response) ؛}}}}