في تطوير نظام تطبيقات الويب ، تكون وظائف تحميل الملفات وتنزيلها وظائف شائعة الاستخدام. اليوم ، دعنا نتحدث عن تنفيذ وظائف تحميل الملفات وتنزيلها في Javaweb.
1. قم بتحميل مثال بسيط
JSP
<٪@ page language = "java" import = "java.util.*" pageencoding = "utf-8" ٪> <! doctype html public "-// w3c // dtd xhtml 1.0 transitional // en"> <html> <head> charset = utf-8 "/> <title> تحميل الملف وتنزيله </title> </head> <body> <form> action =" $ {pagecontext.request.contextpath}/uploadservlet name = "file1" /> <br /> upload file 2: <input type = "file" name = "file2" /> <br /> <input type = "submit" value = "expload" /> < /form> <br /> $ {requestscope.message} </body> </html>servlet
Public Void doget (طلب httpservletrequest ، استجابة httpservletresponse) يلقي servleTexception ، ioException {try {// 1. احصل على مصنع مصنع Parser DiskfileItemFactory = New DiskfileItemFactory () ؛ // 2. احصل على تحميل servletfileupload المحلل = جديد servletfileupload (المصنع) ؛ // 3. حدد نوع نموذج التحميل إذا كان (! expload.ismultipartcontent (طلب)) {// تحميل النموذج هو نموذج عادي ، ثم الحصول على البيانات بالطريقة التقليدية والعودة ؛ } // لتحميل نموذج ، يتم استدعاء المحلل لتحليل قائمة بيانات التحميل <IbourItem> list = upload.parserequest (request) ؛ // fileitem // transipulation القائمة للحصول على كائن بيانات عنصر إدخال أول تحميل لـ (fileitem item: list) {if (item.isformfield ()) {// ما تحصل عليه هو اسم سلسلة الإدخال العادي = item.getfieldname () ؛ // احصل على اسم قيمة سلسلة عنصر الإدخال = item.getString () ؛ System.out.println (name + "=" + value) ؛ } آخر {// احصل على fileName string expt induction = item.getName () ؛ // الحصول على اسم الملف المحمّل C:/المستندات والإعدادات/ThinkPad/Desktop/1.txt fileName = filename.substring (filename.lastindexof ("//")+1) ؛ inputStream in = item.getInputStream () ؛ // الحصول على تحميل البيانات int len = 0 ؛ Byte Buffer [] = New Byte [1024] ؛ // يجب أن يمنع الدليل المستخدم لحفظ الملفات التي تم تحميلها العالم الخارجي من الوصول مباشرة إلى SavePath = this.getServletContext (). System.out.println (SavePath) ؛ FileOutputStream Out = fileOutputStream جديد (SavePath + "/" + اسم الملف) ؛ // اكتب ملف إلى دليل التحميل بينما ((len = in.read (buffer))> 0) {out.write (buffer ، 0 ، len) ؛ } in.close () ؛ out.close () ؛ request.setAttribute ("Message" ، "Upload Success") ؛ }}}} catch (استثناء e) {request.setAttribute ("message" ، "FAILLOAD FAILLED") ؛ E.PrintStackTrace () ؛ }}2. وظيفة التحميل المعدلة:
ملحوظات:
1. رمز مشوه صيني لتحميل أسماء الملفات والرمز المشوهة الصيني لتحميل البيانات
تحميل. // حل رمز مشوهة صيني لتحميل أسماء الملفات
// يتم تحميل النموذج للملف ، وترميز الطلب غير صالح ، ولا يمكن تحويله يدويًا إلا
1.1 value = new String (value.getBytes ("ISO8859-1") ، "UTF-8") ؛
1.2 قيمة السلسلة = item.getString ("UTF-8") ؛
2. لضمان أمان الخادم ، يجب وضع ملفات التحميل في الدلائل التي لا يمكن الوصول إليها مباشرة من قبل العالم الخارجي.
3. لمنع الكتابة فوق الملف ، يجب إنشاء اسم ملف فريد لتحميل الملف.
4. لمنع الكثير من الملفات من الظهور تحت دليل ، تحتاج إلى استخدام خوارزمية التجزئة لتفكيك التخزين.
5. للحد من القيمة القصوى للملفات التي تم تحميلها ، يمكنك استخدام طريقة: servletfileupload.setfilesizemax (1024) والتقاط:
fileuploadbase.filesizeLimitexceedEdException استثناء لإعطاء مطالبات سهلة الاستخدام
6. إذا كنت ترغب في التأكد من حذف الملف المؤقت ، فيجب عليك الاتصال بطريقة item.delete بعد معالجة ملف التحميل.
7. للحد من نوع الملف الذي تم تحميله: عند استلام اسم الملف الذي تم تحميله ، حدد ما إذا كان اسم لاحقة قانونيًا.
8. استمع إلى تقدم تقدم الملف:
servletfileupload تحميل = جديد servletfileupload (المصنع) ؛ Upload.SetProgressRistener (New ProgressListener () {public void update (pbytesread long ، long pcontentLength ، int arg2) {system.out.println ("حجم الملف هو:" + pcontentLength + "، معالجته حاليًا:" + pbytesread) ؛}}) ؛ 9. إضافة عناصر إدخال تحميل الملف ديناميكيًا في صفحة الويب
وظيفة addinput () {var div = document.getElementById ("file") ؛ var input = document.createElement ("input") ؛ input.type = "file" ؛ input.name = "filename" ؛ var del = document.createElement ("input") ؛ del.type = "button" ؛ del.value = "delete" ؛ del.onclick = function d () {this.parentNode.parentNode.removechild (this.parentNode) ؛ } var innerdiv = document.createElement ("div") ؛ innerdiv.appendchild (إدخال) ؛ innerdiv.appendchild (del) ؛ Div.AppendChild (Innerdiv) ؛ }تحميل JSP:
أقل addInput () {var div = document.getElementById ("file") ؛ var input = document.createElement ("input") ؛ input.type = "file" ؛ input.name = "filename" ؛ var del = document.createElement ("input") ؛ del.type = "button" ؛ del.value = "delete" ؛ del.onclick = function d () {this.parentNode.parentNode.removechild (this.parentNode) ؛ } var innerdiv = document.createElement ("div") ؛ innerdiv.appendchild (إدخال) ؛ innerdiv.appendchild (del) ؛ Div.AppendChild (Innerdiv) ؛ } </script> </head> <body> <form action = "" enctype = "mutlipart/form-data"> </form> <table> <tr> <td> upload user: </td> <td> <td type = "text" text "name =" username "> </td> <tr> <td> value = "إضافة ملف تحميل" onClick = "addInput ()"> </td> </tr> <tr> <td> </td> <td> <div id = "file"> </fiv> </td> </td> </td> </tablتحميل servlet
يمتد exploadservlet1 من الفئة العامة httpservlet {public void doget (httpservletrequest request ، httpservletresponse) يلقي servletexception ، ioException {//request.getParameter("username ") ؛ // **** rererm request.setcharacterencoding ("UTF-8") ؛ // يتم تحميل النموذج للملف ، وترميز الطلب غير صالح // الحصول على الملف المحمّل SavePath = this.getServletContext (). getRealPath ("/web-inf/upload") ؛ حاول {diskfileItemFactory Factory = new DiskfileItemFactory () ؛ Factory.SetRepository (ملف جديد (this.getServletContext (). servletfileupload تحميل = جديد servletfileupload (المصنع) ؛ /*Upload.setProgresserender(new ProgressListener () {public void update (pbyTesRead ، long pcontentLength ، int arg2) {system.out.println ("حجم الملف هو:" + pcontentLength + "، تمت معالجته حاليًا:" + pbytesread) ؛}}}) ؛ // حل الكود المشوّه الصيني لأسماء الملفات If (! epload.ismultipartcontent (request)) {// الحصول على البيانات بطريقة تقليدية ؛ } /*Upload.setFilesizeMax(1024) ؛ Upload.SetSizeMax (1024*10) ؛*/ list <Ibuitem> list = upload.parserequest (request) ؛ لـ (fileitem item: list) {if (item.isformfield ()) {// يتم تغليف بيانات عناصر الإدخال العادية في اسم سلسلة fileItem = item.getFieldName () ؛ قيمة السلسلة = item.getString ("UTF-8") ؛ // value = new string (value.getBytes ("ISO8859-1") ، "UTF-8") ؛ System.out.println (name + "=" + value) ؛ } آخر {// يتم تغليف ملف التحميل في FileItem String Filename = item.getName () ؛ // الملفات المقدمة بواسطة متصفحات مختلفة مختلفة C: /A/1.txt 1.txt system.out.println (filename) ؛ if (filename == null || filename.trim (). يساوي ("")) {متابعة ؛ } filename = filename.substring (filename.lastindexof ("//")+1) ؛ inputStream in = item.getInputStream () ؛ سلسلة SaveFilename = Makefilename (اسم الملف) ؛ // احصل على اسم الملف المحفوظ realsavepath = makepath (SaveFilename ، SavePath) ؛ // احصل على الملف حفظ fileOutputStream Out = جديد fileOutputStream (RealSavePath + "//" + SaveFilename) ؛ Byte Buffer [] = New Byte [1024] ؛ int len = 0 ؛ بينما ((len = in.read (buffer))> 0) {out.write (buffer ، 0 ، len) ؛ } in.close () ؛ out.close () ؛ item.delete () ؛ // حذف ملف مؤقت}}} catch (fileuploadbase.filesizeLimitexceedException e) {e.printstacktrace () ؛ طلب. request.getRequestDispatcher ("/message.jsp"). يعود؛ } catch (استثناء e) {E.PrintStackTrace () ؛ }} السلسلة العامة makefilename (اسم ملف السلسلة) {//2.jpg return uuid.randomuuid (). toString () + "_" + filename ؛ } السلسلة العامة MakePath (اسم ملف السلسلة ، String SavePath) {int hashcode = filename.hashCode () ؛ int dir1 = hashcode & 0xf ؛ // 0--15 int dir2 = (hashcode & 0xf0) >> 4 ؛ // 0-15 string dir = savepath + "//" + 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) ؛ }}3. وظيفة التنزيل
. خريطة الخريطة = new hashmap () ؛ ListFile (ملف جديد (FilePath) ، MAP) ؛ request.setAttribute ("Map" ، MAP) ؛ request.getRequestDispatcher ("/listfile.jsp"). } public void listfile (ملف الملف ، خريطة خريطة) {if (! file.isfile ()) {file file [] = file.listfiles () ؛ لـ (file f: files) {listfile (f ، map) ؛ }} else {string realName = file.getName (). substring (file.getName (). indexof ("_")+1) ؛ //9349249849-88343-8344_a_fan_davi.avi map.put (file.getName () ، RealName) ؛ }} public void dopost (httpservletrequest request ، httpservletresponse) يلقي servleTexception ، ioException {doget (request ، response) ؛ }}عرض JSP
<٪@ page language = "java" import = "java.util. Transitional // en "> <html> <head> <title> my jsp 'listfile.jsp' صفحة البدء </title> </head> <body> <c: foreach var =" me "heads =" $ {map} "> <c: url value ="/servlet/downloadServlet "var =" downurl " value = "$ {meتنزيل المعالجة servlet
يمتد تنزيلات الفئة العامة httpservlet {public void doget (طلب httpservletrequest ، استجابة httpservletresponse) servletexception ، ioException {String filename = request.getParameter ("fileName") ؛ //23239283-92489-avatar.avi filename = new string (filename.getBytes ("ISO8859-1") ، "UTF-8") ؛ string path = makepath (filename ، this.getServletContext (). getRealPath ("/web-inf/upload")) ؛ ملف الملف = ملف جديد (مسار + "//" + اسم الملف) ؛ if (! file.exists ()) {request.setAttribute ("message" ، "المورد الذي تريد تنزيله قد تم حذفه !!") ؛ request.getRequestDispatcher ("/message.jsp"). يعود؛ } string realName = filename.subString (filename.indexof ("_")+1) ؛ استجابة. FileInputStream في = new FileInputStream (path + "//" + اسم الملف) ؛ outputStream Out = response.getOutputStream () ؛ Byte Buffer [] = New Byte [1024] ؛ int len = 0 ؛ بينما ((len = in.read (buffer))> 0) {out.write (buffer ، 0 ، len) ؛ } in.close () ؛ out.close () ؛ } السلسلة العامة MakePath (اسم ملف السلسلة ، String SavePath) {int hashcode = filename.hashCode () ؛ int dir1 = hashcode & 0xf ؛ // 0--15 int dir2 = (hashcode & 0xf0) >> 4 ؛ // 0-15 string dir = savepath + "//" + 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) ؛ }}ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.