أولاً ، اسمحوا لي أن أقدم التقنيات ذات الصلة:
معلمتان مهمتان في طريقة الخدمة.
يستخدم ServletRequest لتلقي طلبات المستخدم ، ووظائفه هي:
واحدة من الفوائد الفرعية: javax.servlet.http.httpservletrequest
يتم استخدام ServletResponse لإرجاع البيانات إلى المستخدم.
واحدة من الفوقيات الفرعية: javax.servlet.http.httpservletresponse
تقنية تنزيل الملف:
تقنية تنزيل الملف بسيطة نسبيًا لتقنية التحميل. لنلتقي بتنزيل الصور كمثال:
تصفح الصور أولاً ثم قم بتنزيلها
1. الرمز الأمامي:
<span style = "font-size: 14px ؛"> <a href = "img"> ابحث عن جميع الصور تحت المجلد </a> <br/> </span>
يمكن أن يتم مكتب الاستقبال في جملة واحدة فقط. ابحث مباشرة عن برامج الخلفية من خلال web.xml
2. رمز عرض الخلفية:
<span style = "size-size: 14px ؛"> refrsimg public showimg يمتد httpservlet {public void dogge (httpservletrequest request ، httpservletresponse) t servleTexception ، ioException {<span style = "white-space: pre" </span> DOPOST (طلب ، استجابة) ؛ // لمنع الاستثناءات ، قم بتوصيل DOGE و DOPOST معًا} </span> <span style = "font-size: 14px ؛" ioException {request.setcharencoding ("utf-8") ؛ "> <span style =" font-size: 14px ؛ "> // <span style =" White-Space: pre "> </span> اتصل بـ servletcontext ، بالطبع ، يمكنك أيضًا تسميته مباشرة --- عندما يتم إدراجها واحدًا تلو الآخر ، يكون المسار المطلق للملف مطلوبًا عند استخدام الصورة </span> ServletContext Context = getServletContext () ؛ string path = context.getRealPath ("/imgs") ؛ // ابحث عن المسار المطلق لملف المجلد = ملف جديد (مسار) ؛ "> // <span style =" White-Space: Pre "> </span> بعد العثور على المجلد ، قم بإدراج جميع الصور للمستخدمين لتصفح ملفات السلسلة [] = file.list () ؛ for (السلسلة fn: الملفات) {</span> <pre name = "code"> <span style = "font-size: 14px ؛"> // أظهر كل منهم </span> String img = "<img src = 'imgs/"+fn+"'/>" ؛
// out.print ("<a href = imgs/'"+fn+"'> تنزيل الصورة </a>) قم بتنزيل الصورة </a> "؛ // وفر تنزيل الارتباط التشعبي ، ومرر المعلمة --- نقل اسم الملف إلى محتوى ارتباط المستخدم واكتب Out.print (str) ؛ out.print (img+" <br/> ") ؛}}
3. تنزيل محدد للملفات
أولاً ، يجب تعيين البروتوكول المقابل. يتطلب بروتوكول التنزيل ضبط رأس التنزيل المقابل
<span style = "White-Space: pre"> </span> <span style = "font-size: 18px ؛"> <strong> response.setContentType ("Application/Force-Download" </strong>) ؛/ /تعيين الرأس المقابل </span> عند التنزيل ، تحتاج إلى عرض اسم الملف للصورة الحالية.
<span style = "font-size: 18px ؛"> <span style = "White-Space: pre"> </span> outputStream Out = response.getOutputStream () ؛ // الحصول على اسم سلسلة دفق الإخراج = reque st. GetParameter ("الاسم") "UTF- 8") ؛ // إذا كان الصينيين بحاجة إلى إعادة ترميز // system.out.println (AA) ؛ مرفق قوي ؛ قم بتنزيل محدد
<span style = "font-size: 18px ؛"> string filename = this.getServletContext (). getRealPath (name) ؛ // احصل يمكن الحصول عليها ويمكنك قراءتها في = fileInputStream (اسم الملف) ؛ {out.write (b ، 0 ، len) ؛ صورة التكاثر:
التقديم بعد النقر:
اسم الملف مختلف
تقنية تحميل الملف
سيكون من المزعج للغاية تحميل الملفات بنفسك ، حتى نتمكن من استخدام حزمة شخص آخر لتنزيل الرابط والنقر لفتح نموذج الارتباط:
يجب على العميل استخدام نوع بيانات multipart/form-data لتمثيل نوع البيانات المركب عند إرسال HTTP.
هذا هو: <form enctype = "multipart/form-data">
استخدم <إدخال type = "file" name = "somename"/> html علامة في النموذج.
الحزمة المطلوبة:
commons-fileupload.jar ، أداة تحميل الملف الأساسية موجودة في هذه الحزمة.
حزمة Commons-IO.JAR مطلوبة لتحميل الملفات
شرح مفصل:
DiskfileItemFactory - إنشاء دليل ملف مراقبة الوقت ، والذي يشير إلى حجم منطقة التخزين المؤقت
يتم استخدام servletfileupload لتحليل httpservletrequest. إرجاع مجموعة من كائنات الملف.
يمثل FileItem كل كائن ملف تم تحميله بواسطة المستخدم.
العملية الرئيسية:
ملف f = ملف جديد ("f:/ex/temp") ؛ // حدد موقع تخزين الملف المؤقت
diskfileitemfactory ff = new DiskfileItemFactory (1024*1024*5 ، f) ؛ // موقع الحجم والتخزين للملفات المؤقتة
servletfileUpload sf = new servletfileupload (FF) ؛
قائمة <FileItem> list = sf.parserequest (request) ؛ // start parsing
لـ (fileItem it: list) {// احصل على اسم الملف. واستخدم Uuid لحل مشكلة الأسماء المكررة
fileutils.copyinputStreamTofile (it.getInputStream () ، ملف جديد (مسار+"/"+اسم الملف)) ؛ // في المجلد المحدد المكتوب
}
1. رمز مكتب الاستقبال:
<span style = "font-size: 18px ؛"> <h2> ملف التحميل </h2> <form action = "upfile" method = "post" <span style = "color:#ff0000 ؛"> enctype = "multipart /form-data "</span>> // يجب أن تتم كتابتها ، وإلا فإن المحطة لا يمكن أن تتلقى البيانات <!-هذا enctype =" multipart/form-data "---> file1 <input type =" file " span style = "color:#ff6666 ؛"> name </span> = "file"/> <br/> الرجاء إدخال اسم: <input type = "text" <span style = "color:#ff6666 ؛"> name </span> = "desc"/> <br/> file2 <input type = "file" <span style = "color:#ff6666 ؛ "> name </span> =" file "/> <br/> الرجاء إدخال اسم: <input type = "text" <span style = "color:#ff0000 ؛"> name </span> = "desc"/> <br/> <input type = "submit" value = "submit "/> </form> </span>
2. رمز الخلفية:
2-1 أولاً قم بإنشاء مصنع قائم على القرص الثابت لتخزين الملفات المؤقتة
// حدد ملف موقع التخزين المؤقت f = ملف جديد ("F:/Ex/temp") ؛ // حدد موقع التخزين المؤقت DiskfileItemFactory ff = new diskfileitemfactory (1024*1024*5 ، f) ؛ ملف مؤقت وتخزين موقع2-2 قم بإنشاء كائن servletfileupload وضبط حجم الملف لزيادة نقل الملف إلى الحد الأقصى
// إنشاء كائن لتحليل servletfileupload sf = new ServletFilePload (FF) ؛ *20) ؛
2-3 ابدأ في تحليل الكائن
<span style = "White-Space: Pre"> </span> List <IbourItem> list = sf.parserequest (request) ؛ // احصل على جميع المعلومات المنقولة من مكتب الاستقبال ، يجب أن يملأ مكتب الاستقبال enctype = "multipart /form- بيانات "لـ (fileItem it: list) {it0 = it ؛ // <span style =" white-space: pre "> </span> إذا كان كائن نموذج طبيعي-يمكنك الحكم مباشرة على ( it.isformfield ()) {// إنه عنصر نموذج عادي ، مثل type = اسم اسم سلسلة قيمة اسم = it.getString ("utf-8") ؛ +name) ؛ // أسفل اسم التفسير المكتوب} آخر {<span style = "White-Space: Pre"> </span> // هذا هو اسم الملف المحدد بواسطة اسم سلسلة المكتب الاستقبال = it.getName () ؛ // مسار الملف المحدد-مسار absolute // string str = it.getString () ؛ // المحتويات في الملف // system.out.println ("str"+str) ؛ .getContentType () ؛ <pre name = "code" style = "font- size: 18px ؛"> // <span style = "White-Space: pre"> </span> لا يمكن أن يكون اسم ملف المورد على جانب الخادم باللغة الصينية ، سيقوم المتصفح تلقائيًا بتشفيره ---------------------------------------------- ------------------------------------------------- ------------------------------------------------- ------------------------------------------------- ---------- تم تحويل اسم الملف الذي تم تحميله إلى اسم بدون تخزين صيني. يجب تخزين اسم التعيين ، ثم تحويله مرة أخرى عند تنزيل المستخدم. // معرف سلسلة اسم الخريطة = uuid.randomuuid (). LastIndexof (".")) ؛ // تم العثور على تنسيقات ملفات الملف // اسم ملفات السلسلة المركب = id+lastName ؛ // اسم ملف جديد // نسخ دفق. دعها تكتب إلى الموقع المقابل fileUtils.copyinputStreamTofile (it.getInputStream () ، ملف جديد (مسار+"/"+اسم الملف)) ؛ // المسار هو المسار المطلق للتخزين السابق}}
يمكن أن يحقق ذلك تحميلات بسيطة ، لكن هذا النوع من التحميل غير آمن على الإطلاق. يتم إرفاق الرمز الكامل بمشاكل طفيفة لمنع المشكلات العامة.
بعد تحديد الملف
تحقق من الملفات الموجودة في خادم الويب IMG ، تم تحميل الملف على الصفحة "اسم الملف الذي تم إنشاؤه بواسطة UUID"
رمز مصدر تحميل الملف:
<span style = font-size: 14px ؛ " java.Util.List . Apache.Commons .io.fileutils ؛ لا يوجد استجابة <span style = "White-Space: pre ؛"> </span> Override <span style = "white-space: pre ؛"> </span> void void doget (httpservletrequest req ، http servletResponse resp) < span style = "White-Space: Pre ؛"> </span> يلقي ServleTexception ، IoException {<span style = "White-Space: Pre ؛"> </span> resp.setContentType ("UTF-8") ؛ span style = "White-Space:" مدعوم بعد التحميل طريقة ") ؛ <span style =" White-Space: pre ؛ "> </span>} <span style =" White-Space: pre ؛ "> </span> <span style =" White-Space : pre ؛ "> </span> public void dopost (httpservletrequest request ، httpservletresponse response) <span style =" white-space: pre ؛ "> </span> rems servlexception ، ioException {<span style =" White-Space: pre ") ؛ <span style =" White-Space: pre ؛ "> </span> printWriter Out = response.getWriter () ؛ <span style =" White-Space: pre ؛ "> </span> // protect to طريقة تحميل النماذج العادية 1: <span style = "White-Space: pre ؛"> </span> // Getting Get (NULL) post1 (aplisation/x-form-urlencoded ، normal form) post2 (file: multipart/ نموذج-نموذج تحميل الملف) // <span style = "White-Space: Pre ؛"> </span> type = request.getContentType () ؛ > </span>: من النماذج العادية 2 ") ؛ // <span style =" White-Space: pre ؛ "> </span> return ؛ // <span style =" White-Space: Pre ؛ "> </span>} <span Style = "White-Space: Pre ؛"> </span> // Method 2 <span style = "White-Space: Pre ؛"> </span> Boolean Boo = "المساحة البيضاء: pre ؛"> </span> if (boo == false) {<span style = "white-space: pre ؛"> </span> out.print ("تحميل 1 من النماذج العادية لا مدعوم ") ؛ <span style =" White-Space: pre ؛ "> </span> <span style =" White-Space: pre ؛ "> </span>} <span style =" White-Space: pre ؛ "> </span>} span> <span style =" White-Space: pre ؛ "> </span> // حدد موقع التخزين المؤقت <span style =" White-Space: pre ؛ "> </span> file f = ملف جديد ("f:/ex/temp") ؛ // حدد موقع تخزين الملفات المؤقت <span style = "white-Space: pre ؛"> </span> diskfileitemfactory ff = new diskfileitemfactory (1024*1024* 5 ، F) ؛ // حجم الملف المؤقت وموقع التخزين <span style = "White-Space: Pre ؛"> </span> <span style = "White-Space: pre ؛"> </span> // إنشاء كائن لتحليله <span style = "white-space:" (1024*1024*10) ؛ // الحد الأقصى لقيمة موقع تخزين واحد فقط هو 10 أمتار <span style = "White-Space: pre ؛"> </span> sf.setsizemax (1024*1024*20) ؛/ /القيمة القصوى لجميع الملفات هي 20m <span style = "White-Space: Pre ؛"> </span> مسار السلسلة = this.getServletContext (). getRealPath ("/imgs") ؛ المساحة: pre ؛ "> </span> system.out.println (" مسار التخزين: "+path) ؛ <span style =" White-Space: pre ؛ "> </span> // ابدأ التحليل <span style = "الفضاء الأبيض: pre ؛" "White-Space: Pre ؛"> </span> List <IbleItem> list = sf.parserequest (request) ؛ // احصل على جميع المعلومات المنقولة من مكتب الاستقبال ، يجب على مكتب الاستقبال ملء enctype = "multipart/form- Data "<span style =" White- Space: pre ؛ "> </span> for (fileItem it: list) {<span style =" white-space: pre ؛ "> </span> it0 = it ؛ <span style = "White-Space: pre ؛"> </span> if (it.isformfield ()) {// هو عنصر نموذج عادي ، مثل type = قيمة النص للاسم <span style = "White-Space: pre ؛ "> </span> name string = it.getString (" UTF-8 ") ؛ <span style =" white-space: pre ؛ "> </span> system.out.println (" اسم عنصر النموذج الأساسي: "+اسم) ؛ // مكتوب أدناه اسم التفسير هو <span style =" White-Space: pre ؛ "> </span>} else {<span style =" white-space: pre ؛ "> </ span> string name = it.getName () ؛//path path // <span style = "White-Space: pre ؛"> </span> string n1 = it.getfieldname () ؛ "White-Space: Pre ؛"> </span> String str = it.getString () ؛ // المحتوى في الملف // <span style = "White-Space: Pre ؛"> </span> نظام. out.println ("str"+str) ؛ -space: pre ؛ "> </span> string contentType = it.getContentType () ؛ <span style =" white-space: pre ؛ "> </span> size long = it.getSize () ؛ <span style = "White-Space: Pre ؛"> </span> // منع الملف من فارغة <span style = "White-Space: Pre ؛"> </span> if (size == 0) {<span style = " الفضاء الأبيض: pre ؛ "> </span> متابعة ؛ // الملف فارغ ، إرجاع مباشرة ؛ <span style =" White-Space: pre ؛ "> </span>} <span style =" White-Space : pre ؛ "> </span> // اسم المستخدم. يجب أن تملأ <span style = "White-Space: pre ؛"> </span> if (name == null || name.trim () == "") {<span style = "white-space: pre ؛ "> </span> "White-Space:"> </span> System.out.println (name+"،"+contentType+"،"+size) ؛ / لا يمكن أن يكون اسم ملف المورد على جانب الخادم باللغة الصينية ، وسيقوم المتصفح تلقائيًا بتشفيره ------------------------------ ------------------------------------------------- ------------------------------------------------- ------------------------------------------------- ------------------------------------------------- ------> </span> // من أجل السماح للمستخدمين باستعادة اسمهم الأصلي عند التنزيل ، يجب عليهم تخزين المراسلات بين اسم الملف الأصلي واسم التعيين ، وتحويله مرة أخرى عند تنزيل المستخدم. pre ؛ "> </span> // اسم رسم الخرائط <span style =" White-Space: pre ؛ "> </span> string id = uuid.randomuuid (). ) ؛ ("")) ؛ </span> اسم FileName = id+lastName ؛ دعها تكتب إلى الموقع المقابل <span style = "White-Space: pre ؛"> </span> fileUtils.CopyInputStreamTofile (it.getInputStream () ، ملف جديد (path+"/"+filename)) ؛} <span style = "White-Space: pre ؛"> </span>}} catch (fileUploAdexception e) {<span style = "white-space: pre ؛"> </span> رمي RunTimeException جديد ("خطأ تحميل الملف." + e) ؛ span style = "White-Space: pre ؛"> </span> it0.delete () ؛ // حذف ملف مؤقت <span style = "white-space: pre ؛"> </span>}} out.close ( ) ؛}} </span> <span style = "font-size: 18px ؛"> </span> تنزيل ملف رمز المصدر: [html] CN servlet.servlet استجابة الاستجابة) رميات ServleTexcepti على ، ioException {dopost (request ، response) ؛ أرسل اسم المستخدم إلى مكتب الاستقبال/*نقل سلسلة اسم المستخدم الثابتة AA = "1.JPG" ؛ // إذا كان باللغة الصينية ، فأنت بحاجة إلى تشفير AA = urlencoder.encode (AA ، "UTF-8") ؛ استجابة. GetOutputStream () ؛ // الحصول على اسم سلسلة دفق الإخراج = الطلب. Substring (num+1) ؛ التصرف "،" المرفق ؛ filename = '"+aa+"' ') احصل على inportstream المطلقة في = اسم ملف) اكتب (b ، 0 ، len) ؛}}} </span> <span style = "font-size: 18px ؛"> </span>ما سبق هو كل شيء عن هذا المقال ، آمل أن يكون مفيدًا لتعلم الجميع.