في تطوير نظام تطبيقات الويب ، تكون وظائف تحميل الملفات وتنزيلها وظائف شائعة الاستخدام. اليوم ، دعنا نتحدث عن تنفيذ وظائف تحميل الملفات وتنزيلها في Javaweb.
لتحميل الملف ، يقدم المتصفح الملف إلى الخادم في شكل دفق أثناء عملية التحميل. يكون الأمر أكثر إثارة للقلق إذا كنت تستخدم Servlet مباشرة للحصول على دفق الإدخال الخاص بالملف الذي تم تحميله ثم تحليل معلمات الطلب فيه. لذلك ، يتم اختياره عمومًا لاستخدام أداة التحميل المشترك ، مكون تحميل الملف لأداة Apache Open Source. يمكن تنزيل حزمة JAR لمكون تحميل المشترك المشترك على موقع Apache الرسمي ، أو يمكن العثور عليها تحت مجلد LIB للدعامات. تعتمد وظيفة تحميل الدعامات على هذا التنفيذ. يعتمد التحميل المشترك على حزمة Common-IO ، لذلك تحتاج أيضًا إلى تنزيل هذه الحزمة.
1. بناء بيئة التنمية
قم بإنشاء مشروع FileUploAdandDownload وأضف حزمة جرة تحميل ملفات Apache Filepload ، كما هو موضح في الشكل أدناه:
2. تنفيذ تحميل الملف
2.1. صفحة تحميل الملف وصفحة مطالبة الرسائل
رمز صفحة expload.jsp كما يلي:
<٪@ page language = "java" pageencoding = "utf-8" ٪> <! doctype html> <html> <head> <head> expload </title> </head> <body> <form action = "$ {pagecontext.request.contextpath} تحميل مستخدم: <input type = "text" name = "username"> <br/> تحميل الملف 1: <input type = "file" name = "file1"> <br/> تحميل ملف 2: <input type = "file" name = "file2"> <br/> اطبع؟ <٪@ page language = "java" pageencoding = "utf-8" ٪> <! doctype html> <html> <head> <title> مطالبة الرسالة </title> </head> <body> $ {message} </body> </html>2.2. معالجة servlets لتحميل الملفات
كود exploadhandleservlet هو كما يلي:
Package Me.gacl.web.controller ؛ استيراد java.io.file ؛ استيراد java.io.fileOutputStream ؛ استيراد java.io.ioException ؛ استيراد java.io.inputstream ؛ استيراد java.util.list ؛ استيراد javax.servlet.servletexception ؛ استيراد javax.servlet.http.httpservlet ؛ استيراد javax.servlet.http.httpservletrequest ؛ استيراد javax.servlet.http.httpservletresponse ؛ استيراد org.apache.commons.fileupload.fileItem ؛ استيراد org.apache.commons.fileupload.disk.diskfileItemFactory ؛ استيراد org.apache.commons.fileupload.servlet.servletfileupload ؛ يمتد فئة exploadhandleservlet على مستوى الفئة العامة httpservlet {public void doget (httpservletrequest ، استجابة httpservletresponse) يلقي servletexception ، ioException {// الحصول على الدليل المحفوظ للملف المحمّل ، وتخزين الملف المحمّل في الدليل على الويب ، ولا يسمح بالوصول المباشر إلى العالم الخارجي ؛ this.getServletContext (). getRealPath ("/web-inf/expload") ؛ ملف الملف = ملف جديد (SavePath) ؛ // تحكم على ما إذا كان الدليل المحفوظ للملف الذي تم تحميله موجودًا إذا (! file.exists () // إنشاء file.mkdir () ؛ } // Message Presents string message = "" ؛ جرب {// استخدم مكون تحميل ملف Apache لمعالجة خطوات تحميل الملف: // 1. إنشاء DiskfileItemFactory Factory DiskfileItemFactory Factory = New DiskfileItemFactory () ؛ // 2. قم بإنشاء ملف تحميل ملف servletfileUpload = جديد servletfileupload (المصنع) ؛ // حل التحميل الصيني المشوهة. // 3. تحديد ما إذا كانت البيانات المقدمة هي بيانات نموذج التحميل إذا (! servletFileUpload.ismultipartContent (طلب)) {// الحصول على إرجاع البيانات بالطريقة التقليدية ؛ } // 4. استخدم محلل ServletFileUpload لتحليل البيانات التي تم تحميلها. تُرجع نتيجة التحليل قائمة <IberItem>. يتوافق كل ملف fileItem مع عنصر إدخال قائمة النماذج من قائمة النماذج <IRTIM> قائمة = upload.parserequest (request) ؛ لـ (fileitem item: list) {// إذا تم تغليف بيانات عنصر الإدخال العادي في fileItem if (item.isformfield ()) {string name = item.getFieldName () ؛ // حل المشكلة المشوهة الصينية لبيانات عناصر الإدخال العادية قيمة السلسلة = item.getString ("UTF-8") ؛ // value = new string (value.getBytes ("ISO8859-1") ، "UTF-8") ؛ System.out.println (name + "=" + value) ؛ } آخر {// إذا كان عنصر الملف يغلف الملف الذي تم تحميله // احصل على اسم الملف المحمّل ، اسم filename = item.getName () ؛ system.out.println (اسم الملف) ؛ if (filename == null || filename.trim (). يساوي ("")) {متابعة ؛ } // ملاحظة: تختلف أسماء الملفات المقدمة بواسطة متصفحات مختلفة. تقوم بعض المتصفحات بإرسال ملفات ذات مسارات ، مثل: C: /a/b/1.txt ، وبعضها مجرد أسماء ملفات بسيطة ، مثل: 1.TXT // معالجة جزء المسار من اسم ملف الملف الذي تم الحصول عليه فقط ، يتم الاحتفاظ فقط بملف اسم الملف = fileName.subString (filename.lastindexof ("//")+1) ؛ // احصل على دفق الإدخال للملف الذي تم تحميله في indep inputStream في = item.getInputStream () ؛ // إنشاء ملف Filetption FileOutputStream Out = جديد fileOutputStream (SavePath + "//" + filename) ؛ // إنشاء عازلة بايت عازلة [] = بايت جديد [1024] ؛ // تحديد ما إذا كانت البيانات الموجودة في دفق الإدخال قد تمت قراءة int int = 0 ؛ // تتم قراءة دفق الإدخال في حلقة المخزن المؤقت ، (len = in.read (buffer))> 0 يعني أنه لا يزال هناك بيانات في الوقت ((len = in.read (buffer))> 0) {// استخدم FileOtputStream Dream لكتابة بيانات المخزن المؤقت إلى الدليل المحدد (Savepath + " +" + filename) Out.Write ( } // أغلق دفق الإدخال in.close () ؛ // أغلق دفق الإخراج Out.Close () ؛ // حذف الملف المؤقت الذي تم إنشاؤه عند معالجة تحميل الملف. delete () ؛ message = "تم تحميل ملف الملف بنجاح!" ؛ }}}} catch (استثناء e) {message = "فشل تحميل الملف!" ؛ E.PrintStackTrace () ؛ } request.setAttribute ("message" ، message) ؛ request.getRequestDispatcher ("/message.jsp"). } public void dopost (httpservletrequest request ، httpservletresponse) يلقي servletexception ، ioException {doget (request ، response) ؛ }}تسجيل exploadhandleservlet في ملف web.xml
<Sradlet> <Sradlet-Name> UploadHandleservlet </rectlet-name> <Servlet-Class> me.gacl.web.controller.uploadhandleservlet </revlet-class> </radlet> <Crevlet-mappling> <sterlet-name> uploadhandleservlet </servlet-name> </servlet mapping>
تأثير العملية على النحو التالي:
بعد تحميل الملف بنجاح ، يتم حفظ الملف الذي تم تحميله في دليل التحميل ضمن دليل Web-INF ، كما هو موضح في الشكل أدناه:
2.3. تفاصيل تحميل الملف
على الرغم من أن الكود أعلاه يمكنه تحميل الملفات بنجاح إلى الدليل المحدد على الخادم ، إلا أن هناك العديد من التفاصيل الصغيرة التي يجب إيلاء الاهتمام بها في وظيفة تحميل الملف. يجب إيلاء اهتمام خاص للنقاط الخاصة.
1. لضمان أمان الخادم ، يجب وضع ملفات التحميل في دليل لا يمكن الوصول إليه مباشرة بواسطة العالم الخارجي ، كما هو الحال في دليل الويب.
2. لمنع الكتابة فوق الملف ، يجب إنشاء اسم ملف فريد لتحميل الملف.
3. لمنع الكثير من الملفات من الظهور تحت دليل ، يجب عليك استخدام خوارزمية التجزئة لتفكيك التخزين.
4. يجب أن تكون القيمة القصوى للملفات التي تم تحميلها محدودة.
5. للحد من نوع الملفات التي تم تحميلها ، عند استلام اسم الملف الذي تم تحميله ، حدد ما إذا كان اسم لاحقة قانونيًا.
استجابةً للقضايا الخمسة المذكورة أعلاه ، دعنا نحسن عملية التحميل. الرمز المحسن كما يلي:
Package Me.gacl.web.controller ؛ استيراد java.io.file ؛ استيراد java.io.fileOutputStream ؛ استيراد java.io.ioException ؛ استيراد java.io.inputstream ؛ استيراد java.util.list ؛ استيراد java.util.uuid ؛ استيراد javax.servlet.servletexception ؛ استيراد javax.servlet.http.httpservlet ؛ استيراد javax.servlet.http.httpservletrequest ؛ استيراد javax.servlet.http.httpservletresponse ؛ استيراد org.apache.commons.fileupload.fileItem ؛ استيراد org.apache.commons.fileupload.fileuploadbase ؛ استيراد org.apache.commons.fileupload.ProgressListener ؛ استيراد org.apache.commons.fileupload.disk.diskfileItemFactory ؛ استيراد org.apache.commons.fileupload.servlet.servletfileupload ؛ / ** * className: UploadHandleservlet * description: TODO (أستخدم جملة واحدة لوصف وظيفة هذه الفئة) * Author: ضمان canglang * @Date: 2015-1-3 11:35:50 PM * */ public class uploadleservlet يمتد httpservlet ServleTexception ، ioException {// احصل على الدليل المحفوظ للملف الذي تم تحميله ، وتخزين الملف الذي تم تحميله في دليل Web-INF ، ولا يسمح بالوصول المباشر من العالم الخارجي لضمان أمان سلسلة الملفات المحملة SavePath = this.getServletContext (). // يتم حفظ الملف المؤقت الذي تم إنشاؤه أثناء التحميل بواسطة سلسلة الدليل temppath = this.getServletContext (). getRealPath ("/web-inf/temp") ؛ ملف tmpfile = ملف جديد (temppath) ؛ if (! tmpfile.exists ()) {// إنشاء دليل مؤقت tmpfile.mkdir () ؛ } // يطالب الرسالة برسالة string = "" ؛ جرب {// استخدم مكون تحميل ملف Apache لمعالجة خطوات تحميل الملف: // 1. إنشاء DiskfileItemFactory Factory DiskfileItemFactory Factory = New DiskfileItemFactory () ؛ // اضبط حجم المخزن المؤقت للمصنع. عندما يتجاوز حجم الملف الذي تم تحميله حجم المخزن المؤقت ، سيتم إنشاء ملف مؤقت وتخزينه في الدليل المؤقت المحدد. المصنع. إذا لم يتم تحديدها ، فإن حجم المخزن المؤقت هو 10 كيلو بايت بشكل افتراضي. // قم بتعيين دليل التخزين للملف المؤقت الذي تم إنشاؤه أثناء تحميل Factory.SetRepository (TMPFile) ؛ // 2. قم بإنشاء ملف تحميل ملف servletfileUpload = جديد servletfileupload (المصنع) ؛ . 14608 ، تمت معالجته حاليًا: 7367 حجم الملف هو: 14608 ، تمت معالجته حاليًا: 11419 حجم الملف هو: 14608 ، تمت معالجته حاليًا: 14608 */}}) ؛ // حل التحميل الصيني المشوهة. // 3. تحديد ما إذا كانت البيانات المقدمة هي بيانات نموذج التحميل إذا (! servletFileUpload.ismultipartContent (طلب)) {// الحصول على إرجاع البيانات بالطريقة التقليدية ؛ } // قم بتعيين الحد الأقصى لقيمة حجم الملف الفردي الذي تم تحميله ، والذي يتم تعيينه حاليًا على 1024*1024 بايت ، أي 1 ميجابايت تحميل. // قم بتعيين الحد الأقصى لقيمة العدد الإجمالي للملفات التي تم تحميلها ، الحد الأقصى القيمة = مجموع الأحجام القصوى للملفات المتعددة التي تم تحميلها في نفس الوقت ، والتي يتم تعيينها حاليًا على 10 ميغابايت تحميل. SetSizemax (1024*1024*10) ؛ // 4. استخدم محلل ServletFileUpload لتحليل البيانات التي تم تحميلها. تقوم نتيجة التحليل بإرجاع مجموعة <IptiTem> ، كل FileItem يتوافق مع عنصر إدخال قائمة النماذج من قائمة <FileItem> قائمة = Upload.ParsereQuest (طلب) ؛ لـ (fileItem item: list) {// إذا كان fileItem يغلف بيانات عناصر الإدخال العادية if (item.isformfield ()) {string name = item.getFieldName () ؛ // يحل المشكلة الصينية المشوهة لبيانات عناصر الإدخال العادية قيمة سلسلة = item.getString ("UTF-8") ؛ // value = new string (value.getBytes ("ISO8859-1") ، "UTF-8") ؛ System.out.println (name + "=" + value) ؛ } آخر {// إذا كان fileItem يغلف الملف الذي تم تحميله // احصل على اسم الملف المحمّل ، اسم filename = item.getName () ؛ system.out.println (اسم الملف) ؛ if (filename == null || filename.trim (). يساوي ("")) {متابعة ؛ } // ملاحظة: تختلف أسماء الملفات المقدمة بواسطة متصفحات مختلفة. تقوم بعض المتصفحات بإرسال أسماء الملفات بالمسارات ، مثل: c: /a/b/1.txt ، في حين أن بعضها مجرد أسماء ملفات بسيطة ، مثل: 1.txt // معالجة جزء المسار من اسم ملف الملف الذي تم الحصول عليه تم الحصول عليه فقط ، يتم الاحتفاظ بجزء اسم الملف فقط في الملف = fileName.subString (fitlename.lastindexof ("//")+1) ؛ // احصل على امتداد سلسلة الملفات التي تم تحميلها filextname = filename.substring (filename.lastindexof (".")+1) ؛ // إذا كنت بحاجة إلى الحد من نوع الملف الذي تم تحميله ، فيمكنك استخدام ملحق الملف لتحديد ما إذا كان نوع الملف الذي تم تحميله هو نظام قانوني. // احصل على دفق الإدخال للملف الذي تم تحميله في indep inputStream في = item.getInputStream () ؛ // احصل على اسم الملف المحفوظ SaveFilename = MakeFilename (اسم الملف) ؛ // احصل على ملف حفظ سلسلة Directory RealSavePath = MakePath (SaveFilename ، SavePath) ؛ // قم بإنشاء ملف FileOutPutStream لإخراج ملف OUT = جديد fileOutputStream (RealSavePath + "//" + SaveFilename) ؛ // إنشاء عازلة بايت عازلة [] = بايت جديد [1024] ؛ // تحديد تحديد ما إذا كانت البيانات في دفق الإدخال قد تمت قراءة int len = 0 ؛ // تتم قراءة دفق الإدخال في المخزن المؤقت ، (len = in.read (buffer))> 0 يعني أنه لا يزال هناك بيانات في حين (len = in.read (buffer))> 0) {// استخدم FileOutputStream Dreath لكتابة بيانات المخزن المؤقت إلى الدليل المحدد (SavePath + " + } // أغلق دفق الإدخال in.close () ؛ // أغلق دفق الإخراج Out.Close () ؛ // حذف الملف المؤقت الذي تم إنشاؤه عند معالجة ملف تحميل///item.delete () ؛ message = "تم تحميل ملف الملف بنجاح!" ؛ }}} catch (fileuploadbase.filesizeLimitexceedException e) {E.PrintStackTrace () ؛ طلب. request.getRequestDispatcher ("/message.jsp"). يعود؛ } catch (fileuploadbase.sizeLimitexceedEdException e) {e.printStackTrace () ؛ request.setAttribute ("Message" ، "الحجم الإجمالي للملف الذي تم تحميله يتجاوز الحد الأقصى لقيمة الحد !!!") ؛ request.getRequestDispatcher ("/message.jsp"). يعود؛ } catch (استثناء e) {message = "فشل تحميل الملف!" ؛ E.PrintStackTrace () ؛ } request.setAttribute ("message" ، message) ؛ request.getRequestDispatcher ("/message.jsp"). } /*** @method: makefilename* description: قم بإنشاء اسم الملف للملف الذي تم تحميله ، مع اسم الملف على أنه: uuid+ "_"+ الاسم الأصلي للملف* @Anthor: 发官网* private filename (filename) الاسم الأصلي للملف* return uuid+ "_"+ الاسم الأصلي للملف* // لمنع الكتابة فوق الملف ، يجب إنشاء اسم ملف فريد لتحميل الملف. إرجاع uuid.randomuuid (). toString () + "_" + اسم الملف ؛ } / *** لمنع الكثير من الملفات من الظهور تحت دليل ، تحتاج إلى استخدام خوارزمية التجزئة لتفكيك التخزين* method: makepath* description:* @Anthor: the lone و strogant wolf** param filename the filed strage filetory ، internate the storing directory on the file cave cave cave cave stogring* stringpath* store. اسم الملف ، String SavePath) {// احصل على قيمة hashcode لاسم الملف ، وما تحصل عليه هو عنوان اسم ملف كائن السلسلة في الذاكرة int hashcode = fileName.hashCode () ؛ int dir1 = hashcode & 0xf ؛ // 0--15 int dir2 = (hashcode & 0xf0) >> 4 ؛ // 0-15 // إنشاء سلسلة حفظ جديدة dir = savepath + "//" + dir1 + "//" + dir2 ؛ // upload/2/3 upload/3/5 // file يمكن أن يمثل كل من الملف وملف ملف الدليل = ملف جديد (dir) ؛ // إذا لم يكن الدليل موجودًا إذا (! file.exists ()) {// ، قم بإنشاء file.mkdirs () ؛ } إرجاع دير ؛ } public void dopost (httpservletrequest request ، httpservletresponse) يلقي servletexception ، ioException {doget (request ، response) ؛ }}بعد تحسين خمسة تفاصيل صغيرة المذكورة أعلاه ، كانت وظيفة تحميل الملفات لدينا كاملة نسبيًا.
3. تنزيل الملف
3.1. سرد موارد الملف المقدمة للتنزيل
نريد توفير موارد الملف في نظام تطبيق الويب للمستخدمين للتنزيل. أولاً ، نحتاج إلى الحصول على صفحة لسرد جميع الملفات في دليل الملف الذي تم تحميله. عندما ينقر المستخدم على ملف Hyperlink لتنزيل الملف ، سيتم تنزيله واكتب قائمة ListFileservlet لسرد جميع الملفات التي تم تنزيلها في نظام تطبيق الويب.
رمز ListFileservlet على النحو التالي:
Package Me.gacl.web.controller ؛ استيراد java.io.file ؛ استيراد java.io.ioException ؛ استيراد java.util.hashmap ؛ استيراد java.util.map ؛ استيراد javax.servlet.servletexception ؛ استيراد javax.servlet.http.httpservlet ؛ استيراد javax.servlet.http.httpservletrequest ؛ استيراد javax.servlet.http.httpservletresponse ؛ / ** * @classname: listfileservlet * description: قائمة جميع الملفات التي تم تنزيلها في نظام الويب * @Author: ضمان * date: 2015-1-4 9:54:40 pm * */ public class listfileServlet يمتد httpservlet //احصل على الدليل لتحميل ملفات string apploadFilePath = this.getServletContext (). // تخزين اسم الملف المراد تنزيله خريطة <string ، string> fileNameMap = new hashmap <string ، string> () ؛ // اجتياز جميع الملفات والأدلة بشكل متكرر في دليل FilePath ، وتخزين اسم الملف للملف في قائمة مجموعة MAP (ملف جديد (UploadFilePath) ، FileNamemap) ؛ // يمكن أن يمثل الملف إما ملفًا أو دليلًا/ request.getRequestDispatcher ("/listfile.jsp"). } /*** @method: listfile* description: اجتياز متكرر جميع الملفات في الدليل المحدد* ANTHOR: 光克* @ملف param يعني ملفًا ، ويمثل أيضًا مجموعة ملفات ملفات* param تخزن أسماء الملفات* /public void list (file file ، map ، map> map) { if (! file.isfile ()) {// اذكر جميع الملفات والأدلة في ملفات ملفات الدليل [] = file.listfiles () ؛ // نقل الملفات [] Array لـ (file f: files) {// Relegefile listfile (f ، map) ؛ }} آخر { /*** معالجة اسم الملف. تتم إعادة تسمية الملف الذي تم تحميله في شكل اسم UUID_FILE. قم بإزالة جزء UUID_ من اسم الملف. إذا كان اسم الملف مشابهًا لـ: 9349249849-88343-8344_A_FAN_DAVI.AVI ، ثم يمكن الحصول على file.getName (). file.getName (). substring (file.getName (). indexof ("_")+1) ؛ //file.getName () يحصل على الاسم الأصلي للملف. هذا الاسم فريد من نوعه ، بحيث يمكن استخدامه كمفتاح. الاسم الحقيقي هو الاسم المعالج. قد يتكرر map.put (file.getName () ، realName) ؛ }} public void dopost (httpservletrequest request ، httpservletresponse) يلقي servleTexception ، ioException {doget (request ، response) ؛ }} هنا أتحدث بإيجاز عن طريقة ListFile في ListFileservlet. يتم استخدام طريقة ListFile لسرد جميع الملفات في الدليل. تستخدم طريقة ListFile العودية. في التطوير الفعلي ، سنقوم بالتأكيد بإنشاء جدول في قاعدة البيانات ، والتي ستخزن اسم الملف الذي تم تحميله ودليل التخزين المحدد للملف. يمكننا أن نعرف دليل التخزين المحدد للملف عن طريق الاستعلام عن الجدول ، وليس هناك حاجة لاستخدام عمليات التكرار. هذا المثال هو أن قاعدة البيانات لا تقوم بتخزين اسم الملف الذي تم تحميله وموقع التخزين المحدد للملف ، ويتم استخدام موقع التخزين للملف الذي تم تحميله لكسر التخزين ، لذلك هناك حاجة إلى عودة. أثناء التكرار ، يتم تخزين اسم الملف الذي تم الحصول عليه في مجموعة الخريطة التي تم تمريرها من الخارج إلى طريقة ListFile ، حتى نتمكن من التأكد من تخزين جميع الملفات في مجموعة الخريطة نفسها.
تكوين ListFileservlet في ملف web.xml
<Sradlet> <Sradlet-Name> listfileservlet </revlet-name> <Servlet-class> me.gacl.web.controller.listfileservlet </servlet-class> </servlet> <Sradlet Mapping> <Sradlet-Name> listfileservlet </rename-name> url-patern>
صفحة listfile.jsp التي تعرض الملف الذي تم تنزيله كما يلي:
<٪@ page language = "java" import = "java.util. <!-Traverse Map Collection-> <c: foreach var = "me" عناصر = "$ {fileNameMap}"> <c href = "$ {downurl}"> تنزيل </a> <br/> </c: foreach> </body> </html> من خلال الوصول إلى ListFileservlet ، يمكنك عرض موارد الملف المتوفرة للمستخدمين للتنزيل في صفحة listfile.jsp ، كما هو موضح في الشكل أدناه:
3.2. تنفيذ تنزيل الملف
اكتب servlet لمعالجة تنزيلات الملفات. رمز التنزيلات على النحو التالي:
Package Me.gacl.web.controller ؛ استيراد java.io.file ؛ استيراد java.io.fileInputStream ؛ استيراد java.io.ioException ؛ استيراد java.io.outputStream ؛ استيراد java.net.urlencoder ؛ استيراد javax.servlet.servletexception ؛ استيراد javax.servlet.http.httpservlet ؛ استيراد javax.servlet.http.httpservletrequest ؛ استيراد javax.servlet.http.httpservletresponse ؛ يمتد TloadServlet من الفئة العامة httpservlet {public void doget (httpservletrequest request ، httpservletresponse) يلقي ServleTexception ، ioException {// الحصول على اسم الملف المراد تنزيله filename = request.getParameter ("filename") ؛ //23239283-92489-avatar.avi filename = new string (filename.getBytes ("ISO8859-1") ، "UTF-8") ؛ // يتم حفظ الملفات التي تم تحميلها في الدليل الفرعي لـ/web-inf/expload string filesaverootpath = this.getServletContext (). // اكتشف الدليل الذي يوجد فيه الملف بواسطة مسار سلسلة اسم الملف = FindFilesavePathbyFilename (Filename ، FilesAverootPath) ؛ // احصل على الملف المراد تنزيله ملف الملف = ملف جديد (مسار + "//" + اسم الملف) ؛ // إذا لم يكن الملف موجودًا إذا تم حذف (!! request.getRequestDispatcher ("/message.jsp"). يعود؛ } // معالجة اسم الملف سلسلة realName = filename.substring (filename.indexof ("_")+1) ؛ // قم بتعيين رأس الاستجابة للتحكم في المستعرض لتنزيل File Response.Setheader ("Disposition" ، "المرفق ؛ Filename =" + urlencoder.encode (realName ، "UTF-8")) ؛ // اقرأ الملف المراد تنزيله وحفظه إلى تدفق إدخال الملف FileInputStream في = new FileInputStream (path + "//" + filename) ؛ // إنشاء دفق الإخراج outputStream Out = response.getOutputStream () ؛ // إنشاء المخزن المؤقت Buffer Byte [] = New Byte [1024] ؛ int len = 0 ؛ // loop اقرأ محتوى دفق الإدخال في المخزن المؤقت بينما ((len = in.read (buffer))> 0) {// إخراج محتوى المخزن المؤقت للمتصفح لتحقيق تنزيل الملف Out.write (buffer ، 0 ، len) ؛ } // أغلق دفق إدخال الملف in.close () ؛ // أغلق دفق الإخراج Out.Close () ؛ } /*** method: FindFilesavePathbathbyFilename* description: ابحث عن مسار الملف المراد تنزيله من خلال اسم الملف ودليل جذر التخزين* @Anthor: 发官网* param filenam السلسلة العامة FindFilesavePathbyFilename (اسم ملف السلسلة ، String SaverootPath) {int hashcode = filename.hashCode () ؛ int dir1 = hashcode & 0xf ؛ // 0--15 int dir2 = (hashcode & 0xf0) >> 4 ؛ // 0-15 string dir = saverootpath + "//" + dir1 + "//" + dir2 ؛ // expload/2/3 endload/3/5 file file = new file (dir) ؛ if (! file.exists ()) {// إنشاء file.mkdirs () ؛ } إرجاع دير ؛ } public void dopost (httpservletrequest request ، httpservletresponse) يلقي servletexception ، ioException {doget (request ، response) ؛ }}تكوين تنزيلات في ملف web.xml
<Srevlet> <Servlet-Name> DownloadServlet </servlet-name> <Verlet-Class> me.gacl.web.controller.downloadservlet </revlet-class> </reserlet> <cervlet mapping> <tervlet-name> downloadservlet </servlet-name>
انقر فوق [Download] Hyperlink ، أرسل الطلب إلى التنزيلات ومعالجةه لتحقيق تنزيل الملف. يظهر تأثير التشغيل في الشكل أدناه:
من نتائج التشغيل ، يمكننا أن نرى أن وظيفة تنزيل الملفات لدينا يمكنها تنزيل الملفات بشكل طبيعي.
ما ورد أعلاه هو التفسير الأكثر تفصيلا لتحميل الملف وتنزيل الأمثلة التي قدمها المحرر (الموصى بها). آمل أن يكون ذلك مفيدًا للجميع. إذا كان لديك أي أسئلة ، فيرجى ترك رسالة لي وسوف يرد المحرر على الجميع في الوقت المناسب. شكرا جزيلا لدعمكم لموقع wulin.com!