في تطوير نظام تطبيق الويب ، يتم استخدام وظيفة الملف وتنزيل الملف بشكل شائع اليوم.
لتحميل الملف ، يقدم المتصفح الملف إلى جانب الخادم أثناء تحميل المتصفح. مزعجة بشكل عام ، لذلك اخترت استخدام Apache's Apache من Apache. يمكن تنزيل حزمة JAR الخاصة بمكون التحميل المشترك على موقع Apache الرسمي ، أو يمكنك العثور عليها تحت مجلد STRUTS LIB. يعتمد التحميل المشترك على حزمة Common-IO ، لذلك تحتاج إلى تنزيل هذه الحزمة.
1. بناء بيئة التنمية
قم بإنشاء مشروع FileUploadandDownload ، أضف ملف Apache Commons-FileUpload لتحميل حزمة الجرة ذات الصلة للمكون ، كما هو موضح في الشكل أدناه:
2. تنفيذ تحميل الملف
2.1 ، صفحة تحميل الملف وصفحة مطالبة الرسائل
رمز صفحة expload.jsp كما يلي:
<٪@ page language = "java" pageencoding = "utf-8" ٪> <! }/servlet/eploadHandleservlet "enctype =" multipart/form-data "method =" post "> upload user: <input type =" text " ملف "name =" file1 "> <br/> تحميل ملف 2: <إدخال type =" file "name =" file2 "> <br/> <input type =" submit "value =" proff Form> </body> </html>
رمز message.jsp كما يلي:
<٪@ page language = "java" pageencoding = "utf-8" ٪> <!
2.2 ، التعامل مع الخدمة التي تم تحميلها بواسطة الملف
كود exploadhandleservlet هو كما يلي:
Package Me.gacl.Web.Controller ؛ الاستيراد يمتد httpservlet {طلب {طلب httpservletrequest العامة ، استجابة httpservletresponse) ، يلقي servletexception ، ioException {// leved دليل الحفظ للملف المحمّل ، وتخزين الملفات التي تم تحميلها في دليل الويب الخاص بـ Web ، لا يُسمح بالوصول إليها مباشرة لضمان ذلك مباشرة لضمان ذلك مباشرة Safe SavePath = this.getServletContext (). ) &&! "" "؛ حاول {// استخدم ملف apache لتحميل خطوات تحميل ملفات المعالجة: // 1. إنشاء diskfileitemfactory diskfileiiitemfactory = newFileItem factor () ؛ // 2. المصنع) ؛ 4. استخدم ServiceFilePload Parser لتحليل البيانات وتحميلها. IF (item.isformfield ()) {string name = item. // value = new String (value.getBytes ("ISO8859-1") ، "UTF -8") ؛ مغلف في ملف fileItem ، اسم الملف الذي تم تحميله ، اسم ملف = item.getName () ؛ متابعة ؛} // ملاحظة: تختلف أسماء الملفات المقدمة من متصفحات مختلفة ، وبعض المتصفحات تقدم أسماء الملفات بالمسارات ، مثل: c: /a/b/1.txt ، وبعضها مجرد أسماء ملفات بسيطة ، مثل : 1.txt // المعالجة في مسار الاسم ، فقط اسم ملف اسم الملف = filename.substring (filename.lastindexof ("//") ؛ // احصل item.getInputStream () ؛//إنشاء ملف FileOutputStream Out = new FileOutputStream (SavePath + "//" ما إذا كانت البيانات الموجودة في دفق الإدخال قد قرأت الشعار النهائي int = 0 ؛ في)> 0) {// اكتب بيانات المخزن المؤقت في الدليل المحدد (SavePath + "//" Filename) باستخدام دفق الإخراج FileOutputStream. أغلق () ؛ "؛}}} catch (استثناء e) {message =" فشل تحميل الملف! "؛ ؛ e.printstacktrace () ؛} request.setattribute (" رسالة "، رسالة) ؛ request.getRequestDispatcher (" /message.jsp ") (طلب ، استجابة) ؛}}
تسجيل exploadhandleservlet في ملف web.xml
<Vervlet> <Sradlet-Name> UploadHandleservlet </revlet-name> <Servlet-Class> me.gacl.web.controller.uploadleservlet </revlet-class> </servlet> > UploadHandleservlet </servlet-name> <url-pattern>/servlet/uploadhandleservlet </url-pattern> </revlet mapping>
تأثير الجري كما يلي:
بعد تحميل الملف بنجاح ، يتم تخزين الملف الذي تم تحميله في دليل التحميل في دليل Web-INF ، كما هو موضح في الشكل أدناه:
2.3.
على الرغم من أنه يمكن تحميل الكود أعلاه بنجاح إلى الدليل المخصص على الخادم ، إلا أن هناك العديد من التفاصيل الصغيرة التي تحتاج إلى الاهتمام بوظيفة تحميل الملف.
1. من أجل ضمان أمان الخادم ، يجب وضع ملف التحميل في الدليل الذي لا يمكن للعالم الخارجي الوصول إليه مباشرة ، كما هو الحال في دليل Web-Inf.
2. من أجل منع تغطية الملف ، من الضروري إنشاء اسم ملف فريد لتحميل الملفات.
3. لمنع الكثير من الملفات تحت دليل ، استخدم خوارزمية التجزئة لتفريق التخزين.
4. الحد من القيمة القصوى لملفات التحميل.
5. من الضروري الحد من نوع ملفات التحميل.
استجابةً للتفاصيل الخمسة لما ورد أعلاه ، دعنا نحسن عملية التحميل.
Package Me.gacl.Web.Controller ؛ Import javax.servlet.servletException; Import javax.servlet.httpServlet; Import javax.Servlet.httpServletRequest; Import TP.HTTPSERVLETRESPONSE; Import org.apache.commons.fileupload.FileIItem; Import org.apache .Commons.fileupload.fileuploadBase; Import org .apache.commons.filePload.ProgressLister ؛ Author: التوفر الذئب * date: 2015-1-3 مساءً 11:35:50 */ تحميل الفئة العامة على سبيل المثال. يتم تخزين دليل التحميل في دليل الويب. التحميل يحفظ سلسلة الدليل testh = this.getServletContext (). Message String Message = "" "" " المخزن المؤقت للمصنع. المصنع. // 2. قم بإنشاء ملف لتحميل خدمة Service ServiceFileUpload = New ServiceFileUpload (المصنع) ؛ {System. : 7367 حجم الملف هو: 14608 ، المعالجة الحالية: 11419 حجم الملف هو: 14608 ، تمت معالجته حاليًا: 14608 */}}) ؛ -8 ") ؛ // 3. (1024*1024) 、使用 servletfileupload 解析器解析上传数据 , 解析结果返回的是一个 解析结果返回的是一个 解析结果返回的是一个 解析结果返回的是一个 解析结果返回的是一个 解析结果返回的是一个 集合 集合 每一个 每一个 fileItem 对应一个 form 表单的输入项 rip ) {// إذا كانت مغلفة في ملفات FileItem ، فإن بيانات الإدخال العادية هي (itemformfield)) {string. قيمة item.getString ("UTF-8") ؛ + قيمة) ")} أسماء الملفات البسيطة ، مثل: 1.txt // معالجة اسم ملف اسم الملف للملف المحمّل الذي تم الحصول عليه ، احتفظ فقط بـ filename = filename.substring (filename.lastindexof ("//") ؛ // احصل على الامتداد من سلسلة الملفات التي تم تحميلها filextName = filename.substring (filename.lastindexof ("..") +1) ؛ System.out.println ("تمديد الملف الذي تم تحميله هو:"+filextName) ؛ الملف هو SaveFilename = makefilename (اسم الملف) ؛ بايت جديد [1024] يشير إلى أن هناك بيانات بينما ((len = in.read (buffer)) >> 0) {// اكتب بيانات المخزن المؤقت في الدليل المحدد (SavePath + "//" + filename) باستخدام دفق إخراج FileOutputStream . "؛}}} catch (fileuploadbase.filesizelimitexcexception e) {E.PrintStackTrace () ؛ request.setAttribut "). "/message.jsp"). "؛ اسم ملف التحميل ، اسم الملف هو: uuid+"_"+اسم الملف الأصلي* @Anthor: الاسم الأصلي لملف اسم ملف Lonely Wolf* @Param* uuid+"_"+الاسم الأصلي للملف * /سلسلة خاصة Makefilename (اسم ملف السلسلة) {//2.jpg // لمنع تغطية الملفات ، من الضروري إنشاء اسم ملف فريد من نوعه uuid.randomuid (). * من أجل منع الكثير من الملفات تحت دليل ، استخدم خوارزمية التجزئة لتفريق التخزين * method: MakePath * description: * anthor: اسم ملف FileName المتاح للذئب * param ، وفقًا لدليل تخزين اسم الملف ، * param savepath مسار تخزين الملف* return دليل تخزين جديد*/سلسلة خاصة makepath (اسم ملف السلسلة ، String SavePath) int hashcode = filename.hashCode () ؛ "//" + dir2 ؛ file.exist ()) {// إنشاء ملف الدليل.
بعد تحسين التفاصيل الصغيرة الخمسة المذكورة أعلاه ، تكون وظيفة تحميل الملفات لدينا أكثر اكتمالا.
ثلاثة ، تنزيل الملف
3.1.
نحتاج إلى توفير موارد الملفات في نظام تطبيق الويب للتنزيل. يتم تنفيذ عملية التنزيل.
رمز ListFileservlet على النحو التالي:
Package Me.gacl.Web.Controller ؛ ؛ -4 9:54:40 **/ public class listfileservlet يمتد httpservlet {public void dogge (httpservletrequest request ، httpservletresponse) ows servleTexception ، ioException {// get the the expload file string apploadfilepath = this.getServletxt (). /web-inf/upload ") ؛ // قم بتخزين خريطة اسم الملف <string ، string> fileNameMap = new HashMap <string ، string> () ؛ ملفات ودليل ، قم بتخزين اسم الملف للملف في listfile (ملف جديد (FilePilePath الجديد) ، FileNameMap) ؛ /listfile.jsp "). ويمثل أيضًا دليل ملفات* param خريطة تخزين اسم ملف خريطة اسم خريطة*/ public void listfile (ملف الملف ، خريطة <سلسلة ، سلسلة> خريطة) {// إذا كان الملف لا يمثل ملفًا ، ولكن دليل إذا (! ملف (! .isfile ()) {// اذكر جميع الملفات والدليل في ملفات ملفات الدليل [] = file.listfiles () ؛ خريطة) ؛}} آخر {/*** معالجة اسم الملف ، تتم إعادة تسمية الملف الذي تم تحميله في شكل ملف UUID_ لإعادة تسمية في جزء uuid_ من اسم الملف. getName () ظهر موقع الحرف "_" في سلسلة السلسلة. ") +1 يمكن الحصول على جزء من المروحة _ يحصل على الاسم الأصلي للملف. ) ؛}}
فيما يلي حديثًا موجزًا عن طريقة ListFileservlet. دليل الملف من خلال نموذج الاستعلام. وتخزينها ، لذلك يجب استخدامه للعلامة.
تكوين ListFileservlet في ملف web.xml
<Srevlet> <Servlet-Name> listfileservlet </stervlet-name> <Servlet-class> me.gac l.web.controller.listfileservlet </revlet-class> </stervlet mapping> <sterlet-name> listfileservlet </ servlet-name> <url-pattern>/servlet/listfileservlet </url-pattern> </revlet-mapping>
صفحة listfile.jsp من ملف التنزيل هي كما يلي: على النحو التالي:
<٪@ page language = "java" image = "java.util. /jstl/core "٪> <! doctype html> <html> <head> <title> تنزيل صفحة عرض الملفات </title> </head> <body> <!-اجتياز مجموعة الخريطة-> <c: foreach var = عناصر "me" = "$ {fileNameMap}"> <c: url value = "/server/doubledservlet" var = "double"> <c: param name = "fileename =" $ {me.key} "> </ C: param> </c: url> $ {me.value} <a href = "$ {doublel}"> تنزيل </a> <br/> </c: foreach> </body> </html>
تفضل بزيارة ListFileservlet ، يمكنك عرض موارد الملف المتوفرة للمستخدم في صفحة listfile.jsp ، كما هو موضح في الشكل أدناه ::
3.2
اكتب Servlet لمعالجة الملفات.
Package Me.gacl.Web.Controller ؛ ؛ GetParameter ("FileName") ؛ في دليل/تحميل ويب. إذا لم يكن الملف موجودًا إذا تم حذف الموارد التي تريد تنزيلها! ") ؛ طلب ، استجابة) ؛ encode (realName ، "UTF-8") ؛ .getputstream () (Buffer))> 0) {// محتوى الإخراج العازلة إلى المتصفح ، قم بتنفيذ الملف Out.write (Buffer ، 0 ، Len) ؛} // أغلق تدفق إدخال الملف في. / أغلق دفق الإخراج Out.close () ؛}/ *** method: FindFilesavePathbathbyFilename* description: ابحث عن مسار الملف إلى الملف المراد تنزيله من خلال اسم الملف وتخزين دليل جذر الملف* anthor: e اسم الملف الذي تم تنزيله* param saverootpath قم بتحميل دليل الجذر الذي تم حفظه بواسطة الملف ، أي دليل التخزين للملفات المراد تنزيله بواسطة/web-inf/upload directory* @Return to the download to to to to to السلسلة العامة FindFilesavePilename (سلسلة السلسلة ، S tring saveroot) {int hashcode = filename.hashCode () ؛ DIR = CoveroolPath + "//" Dir1 + "//" ))) {// إنشاء ملف دليل.
تكوين تنزيلات في ملف web.xml
<Vervlet> <vishlet-name> DownloadServlet </servlet-name> <Servlet-class> me.g acl.web.controller.downloadservlet </revlet-class> </rectlet> <servlet-map map ping> <Srevlet-Name> DownloadServlet </servlet-name> <url-pattern>/servlet/downloadServlet </url-pattern> </stervlet mapping>
انقر فوق [تنزيل] الارتباط التشعبي ، أرسل طلب تنزيله لمعالجته ، يمكنك تنزيل تنزيل الملف.
من نتائج العملية ، يمكننا أن نرى أن وظيفة تنزيل الملف لدينا يمكنها بالفعل تنزيل الملف بشكل طبيعي.
تم تجميع هذه المقالة إلى "Java Upload Opergns" ، أرحب بالجميع للتعلم والقراءة.
هناك الكثير من المحتويات حول وظائف تحميل الملفات وتنزيلها في Javaweb.