تشارككم الأمثلة في هذه المقالة تقنية تحميل ملف Java للرجوع إليها. المحتوى المحدد كما يلي
استمارة:
يجب على العميل استخدام نوع بيانات multipart/form-data لتمثيل نوع البيانات المركب عند إرسال HTTP. الآن:
استخدم علامات HTML في النموذج.
الحزمة المطلوبة:
commons-fileupload.jar ، أداة التحميل الأساسية موجودة في هذه الحزمة.
حزمة Commons-IO.JAR مطلوبة لتحميل الملفات
شرح مفصل لتحميل فئة الملفات:
DiskfileItemFactory - إنشاء دليل ملف مراقبة الوقت ، والذي يشير إلى حجم منطقة التخزين المؤقت
يتم استخدام servletfileupload لتحليل httpservletrequest. إرجاع مجموعة من كائنات الملف.
يمثل FileItem كل كائن ملف تم تحميله بواسطة المستخدم.
<٪@ page language = "java" import = "java.util.*" pageencoding = "utf-8" ٪> <! doctype html public "-// w3c // dtd html 4.01 Transitional // en"> اللوحة-فهم الطبقة الأساسية </font> <!-multipart/form-data: multipart (ليس فقط الملفات ، ولكن أيضًا الأجزاء)-> <form action = "<٪ = request.getContextPath () ٪>/epload0" method = "post" enctype = "multipart/form-data" لا يمكن أن يكون اسم الملف الذي تم تحميله باللغة الصينية ، وإلا فإن اسم الملف الذي تم الحصول عليه هو مشوه ، ولكن المثال التالي يمكن أن يحل هذه المشكلة-> </form> <br/> <font color = "Red" size = "6"> استخدم أداة تحميل ملف Apache لتحقيق تحميل الملف </font> <! method = "post" enctype = "multipart/form-data"> الملف: <input type = "file" name = "file"/> <input type = "submit" value = "upload"/> </form> <font color = "red" size = "6" enctype = application/x-www-form-urlencoded (القيمة الافتراضية) </p> <p> post2 (نموذج تحميل الملف): enctype = multipart/form-data: multipart (ليس فقط الملفات ، ولكن أيضًا أجزاء) </p> type = "file" name = "file"/> <!-post2 (نموذج تحميل ملف)-> <br/> وصف الملف: <input type = "text" name = "desc"/> <!-post1 (نموذج عادي)-> <br/> ملف 2: <إدخال type = "file" name = "file"/> <br/> وصف الملف 2: 2: النموذج): enctype = application/x-www-form-urlencoded (القيمة الافتراضية)-> <!-post2 (نموذج التحميل): enctype = multipart/form-data: multipart (ليس فقط الملفات ، ولكن أيضًا أجزاء)-> <form = evata = " type = "file" name = "file"/> <!-post2 (نموذج تحميل ملف)-> <br/> وصف الملف: <إدخال type = "text" name = "desc"/> <!-post1 (نموذج عادي)-> <br/> <br/> ملف 2: <input type = "file" name = value = "upload"/> </part> </body> </html>
فهم الطبقة السفلية للوحة الانتقالية
package cn.hncu.servlet ؛ استيراد java.io.bufferedreader ؛ استيراد java.io.ioException ؛ استيراد java.io.inputstream ؛ استيراد java.io.inputstreamread ؛ استيراد java.io.printwriter ؛ javax.servlet.http.httpservletrequest ؛ استيراد javax.servlet.http.httpservletrespons في = request.getInputStream () ؛ BufferedReader BR = جديد BufferedReader (New InputStreamReader (In)) ؛ خط السلسلة بينما ((line = br.readline ())! = null) {system.out.println (line) ؛ }}}استخدم أداة تحميل ملف Apache لتنفيذ تحميل الملف
package cn.hncu.servlet ؛ import java.io.file ؛ import java.io.ioException ؛ import java.io.printwriter ؛ import java.util.list ؛ exper java.util.uuid ؛ import javax.servlet.servletexception ؛ javax.servlet.http.httpservletrequest ؛ import javax.servlet.http.httpservletrespons org.apache.commons.fileupload.disk.diskfileItemFactory ؛ import org.apache.commons.fileupload.servlet.servletfileupload استجابة httpservletresponse) يلقي servletexception ، ioException {reponse.setContentType ("text/html") ؛ printWriter out = response.getWriter () ؛ out.println ("<! doctype html public/"-// w3c // dtd html 4.01 Transitional // en/">") ؛ out.println ("<html>") ؛ Out.println ("<head> <title> servlet </title> </head>") ؛ out.println ("<body>") ؛ out.print ("لا يدعم الحصول على التحميل. ....") ؛ Out.println ("</body>") ؛ out.println ("</html>") ؛ out.flush () ؛ out.close () ؛ } public void dopost (httpservletrequest request ، httpservletresponse) يلقي servletexception ، ioException {// على الخادم ، حدد دليلًا لجميع مسار سلسلة الملفات المحمّلة = getServletContext (). system.out.println ("path:"+path) ؛ ملف dir = ملف جديد (path) ؛ if (! dir.exists ()) {dir.mkdirs () ؛ } // إنشاء مصنع قائم على القرص الثابت // diskfileitemfactory disk = جديد diskfileItemFactory () ؛ // تعيين دليل مؤقت (يوصى بتصميم دليل مؤقت ، وإلا سيتم استخدام الدليل المؤقت للنظام.) // 3. قم بتعيين حجم المخزن المؤقت لكتابة البيانات إلى قرص القرص الثابت. // عندما يكون الملف أكبر من هذا الإعداد ، سيتم تشكيل ملف مؤقت في الدليل المؤقت // قم بتعيين حجم العازلة المؤقتة للملف المؤقت-8K العازلة ، عنوان الملف المؤقت DiskfileItemFactory F = جديد DiskfileItemFactory (1024*8 ، ملف جديد ("D:/A") ؛ // أداة تحميل-إنشاء كائن لتحليل servletFileUpload تحميل = جديد servletfileupload (f) ؛ expload.setFilesizeMax (1024*1024*5) ؛ // قم بتعيين الحد الأقصى للملف الفردي الذي تم تحميله على 5M // قم بتعيين الحد الأقصى لحجم الملف الذي تم تحميله. إذا كانت ملفات متعددة ، فهو مجموع ملفات متعددة يصل إلى 8M Upload.SetSizeMax (1024*1024*8) ؛ // قم بتعيين مجموع جميع أحجام الملفات التي تم تحميلها حتى 8m // استخدم أداة التحليل لتحرير Try {List <IndItem> list = upload.parserequest (request) ؛ لـ (fileItem fi: list) {system.out.println ("نوع المحتوى الملف:"+fi.getContentType ()) ؛ // نوع المحتوى نوع الملف: text/plain system.out.println ("اسم الملف:"+fi.getName ()) ؛ ext = fi.getName (). substring (fi.getName (). lastIndexof (".")) ؛ //. txt string uuid = uuid.randomuuid (). اسم ملف السلسلة = uuid+ext ؛ // fileutils.copyinputStreamTofile (fi.getInputStream () ، ملف جديد ("d: /a/d/a.txt") File (path+"/"+filename)) ؛ // اكتبها على قيد الحياة}} catch (fileuploadexception e) {e.printstacktrace () ؛ }}} تخزين الملفات التي تم تحميلها في هذا المكان
تحميل المعلومات:
نتائج التحميل:
استخدم أداة تحميل ملف Apache لتحقيق تحميل الملف 2 (حل اسم الملف المشوهة)
package cn.hncu.servlet ؛ import java.io.file ؛ import java.io.ioException ؛ import java.io.printwriter ؛ import java.util.list ؛ expra.util.uuid ؛ import javax.servlet.servletexception ؛ javax.servlet.http.httpservletrequest ؛ import javax.servlet.http.httpservletrespons org.apache.commons.fileupload.disk.diskfileItemFactory ؛ import org.apache.commons.fileupload.servlet.servletfilepload ؛ import org.apache.commons.io.fileutils استجابة httpservletresponse) يلقي servletexception ، ioException {reponse.setContentType ("text/html") ؛ // إذا كان نموذجًا يحتوي على ملفات محمّلة (post2) ، فيمكن للدراما تعيين الترميز فقط في اسم ملف الملف الذي تم تحميله (حل رمزه المشوهة الصيني) // ولكنه لا يمكنه حل الكود المشتعل الصيني لمكونات النماذج العادية في وضع printwriter post2 out = response.getWriter () ؛ out.println ("<! doctype html public/"-// w3c // dtd html 4.01 Transitional // en/">") ؛ out.println ("<html>") ؛ Out.println ("<head> <title> servlet </title> </head>") ؛ out.println ("<body>") ؛ out.print ("لا يدعم الحصول على التحميل. ....") ؛ Out.println ("</body>") ؛ out.println ("</html>") ؛ out.flush () ؛ out.close () ؛ } rework public void dopost (httpservletrequest request ، httpservletresponse) يلقي servletexception ، ioException {// الخطوة 1 // نموذج النموذج العادي (post1) ، يمكن أن تضع الجملة التالية ترميز محتوى مكون النموذج العادي (يمكن حل مشكلة Garbed الصينية). // إذا كان نموذجًا يحتوي على ملفات محمّلة (post2) ، فيمكن أن تقوم هذه الجملة فقط بتعيين الترميز في اسم الملف للملف المحمّل (حل رمزه المشوهة الصيني). ولكن لا يمكنه حل الكود المشهور لمكون النماذج العادي (لا يمكن تعيين ترميزه) // على الخادم ، حدد دليلًا لجميع مسار سلسلة الملفات المحمّلة = getServletContext (). getRealPath ("/upload") ؛ system.out.println ("path:"+path) ؛ ملف dir = ملف جديد (path) ؛ if (! dir.exists ()) {dir.mkdirs () ؛ } // قم بتعيين حجم العازلة المؤقتة للملف-8K العازلة ، عنوان الملف المؤقت DiskfileItemFactory F = new DiskfileItemFactory (1024*8 ، ملف جديد ("D:/A")) ؛ // تحميل أداة servletfileUpload تحميل = جديد servletfileupload (f) ؛ expload.setFilesizeMax (1024*1024*5) ؛ // قم بتعيين أقصى ملف تم تحميله على 5M Upload.SetSizeMax (1024*1024*8) ؛ // قم بتعيين مجموع جميع أحجام الملفات التي تم تحميلها إلى 8m // استخدم أداة التحليل لتحرير Try {List <IndItem> list = upload.parserequest (request) ؛ لـ (fileItem fi: list) {if ((fi.isformfield ())) {// إذا كان مكون النماذج العادي: مربع الاختيار ، الراديو ، كلمة المرور ... // string desc = fi.getString () ؛ System.out.println ("fi.getString ():"+fi.getString ()) ؛ // Second String String desc = fi.getString ("UTF-8") ؛ // تعين هذه الجملة ترميز المحتوى لنظام مكون النموذج العادي. } آخر {string ext = fi.getName (). substring (fi.getName (). lastIndexof (".")) ؛ //. اسم ملف السلسلة = uuid+ext ؛ //fi.getInputStream () هي معلومات الملف الحقيقية fileUtils.copyInputStreamTofile (fi.getInputStream () ، ملف جديد (path+"/"+fileName)) }}}تحميل المعلومات:
نتائج التحميل:
استخدم أداة تحميل ملف Apache لتحقيق تحميل الملف 3 (تفاصيل الملف)
تحسين تخزين الملفات باستخدام دليل التجزئة:
دليل التجزئة هو طريقة لتحسين أداء تخزين الملفات. سواء أكان Windows أو Linux ، سواء كان NTFS أو Ext3 ، فإن عدد العناصر التي يمكن استيعابها في كل دليل محدود.
لا يمكن حفظه ، ولكن عندما يكون عدد المشاريع كبيرة جدًا ، سيتم تقليل سرعة فهرسة الملف.
لذلك ، من الضروري وزن عدد الملفات التي يجب حفظها في الدليل. سيؤثر الادخار على الكثير من الأداء ، في حين أن توفير القليل جدًا سيؤدي إلى الكثير من الدلائل وإهدار المساحة. لذلك عند حفظ مجموعات كبيرة من الملفات ،
هناك خوارزمية يمكنها "كسر" الملفات بالتساوي في مختلف الدلائل الفرعية لتحسين سرعة فهرس كل مستوى. هذه الخوارزمية هي التجزئة. يمكن استخدام MD5 ، SHA1 ، وما إلى ذلك كدليل تجزئة. يستخدم MD5 أيضًا في جلستي للحصول على الرقمين الأول والتاسع من SessionId ، والذي يشكل مسارًا تجزئة على مستوى. وهذا يعني أن النظام يوزع جميع ملفات الجلسة على 16 × 16 = 256 دليل فرعي. على افتراض أن توفير 1000 ملف في كل دليل من دليل Linux يمكن أن يحقق أفضل نسبة أداء فضاء ، يمكن للنظام أن يتم استخدامه بشكل مثالي 256000 ملف جلسة في نفس الوقت.
package cn.hncu.servlet ؛ import java.io.file ؛ import java.io.ioException ؛ import java.io.printwriter ؛ import java.util.list ؛ exper java.util.uuid ؛ import javax.servlet.servletexception ؛ javax.servlet.http.httpservletrequest ؛ import javax.servlet.http.httpservletrespons org.apache.commons.fileupload.progressListener ؛ import org.apache.commons.fileupload.disk.diskfileItemFactory ؛ impare org.apache.commons.fileupload.servlet.servletfileUdileD ؛ Httpservlet {public void dogge (request httpservletrequest ، httpservletresponse) يلقي servletexception ، ioException {response.setContentType ("text/html") ؛ // إذا كان نموذجًا يحتوي على ملفات محمّلة (post2) ، فيمكن للدراما تعيين الترميز فقط في اسم ملف الملف الذي تم تحميله (حل رمزه المشوهة الصيني) // ولكنه لا يمكنه حل الكود المشتعل الصيني لمكونات النماذج العادية في وضع printwriter post2 out = response.getWriter () ؛ out.println ("<! doctype html public/"-// w3c // dtd html 4.01 Transitional // en/">") ؛ out.println ("<html>") ؛ Out.println ("<head> <title> servlet </title> </head>") ؛ out.println ("<body>") ؛ // احصل على الجزء بعد "؟" الرقم في url في طريقة get // http: // localhost: 8080/servletDemo3/upload؟ name = jack & sex = male string qstr = request.getquerystring () ؛ System.out.println ("QSTR:"+QSTR) ؛ // QSTR: name = jack & sex = male out.print ("لا تدعم الحصول على التحميل. ....") ؛ Out.println ("</body>") ؛ out.println ("</html>") ؛ out.flush () ؛ out.close () ؛ } public void dopost (httpservletrequest request ، httpservletresponse) يلقي servletexception ، ioException {reponse.setContentType ("text/html ؛ charset = utf-8") ؛ printWriter out = response.getWriter () ؛ // 1 مضاد للأسود: يتم تقديم الواجهة الأمامية للحماية باستخدام طريقة post1 // الطريقة 1 /* نوع السلسلة = request.getContentType () ؛ if (! type.contains ("multipart/form-data")) {out.println ("تقديم النموذج غير المدعوم") ؛ يعود؛ }*/// method 2 Boolean Boo = servletfileupload.ismultipartContent (request) ؛ if (! boo) {out.println ("تقديم النموذج غير المدعوم") ؛ يعود؛ }. // إذا كان نموذجًا يحتوي على ملفات محمّلة (post2) ، فيمكن أن تقوم هذه الجملة فقط بتعيين الترميز في اسم الملف للملف المحمّل (حل رمزه المشوهة الصيني). ولكن لا يمكنه حل الكود المشهور لمكون النماذج العادي (لا يمكن تعيين ترميزه) // على الخادم ، حدد دليلًا لجميع مسار سلسلة الملفات المحمّلة = getServletContext (). getRealPath ("/upload") ؛ system.out.println ("path:"+path) ؛ ملف dir = ملف جديد (path) ؛ if (! dir.exists ()) {dir.mkdirs () ؛ } // قم بتعيين حجم العازلة المؤقتة للملف-8K العازلة ، عنوان الملف المؤقت DiskfileItemFactory F = new DiskfileItemFactory (1024*8 ، ملف جديد ("D:/A")) ؛ // تحميل أداة servletfileUpload تحميل = جديد servletfileupload (f) ؛ expload.setFilesizeMax (1024*1024*5) ؛ // قم بتعيين أقصى ملف تم تحميله على 5M Upload.SetSizeMax (1024*1024*8) ؛ // قم بتعيين الحد الأقصى للمجموع لجميع أحجام الملفات التي تم تحميلها 8M // pitems) {double d = 1.0*pbyteread/pcontentlength*100 ؛ // استخدم أداة التحليل لتحرير التجربة {list <IndItem> list = upload.parserequest (request) ؛ لـ (fileItem fi: list) {if ((fi.isformfield ())) {// إذا كان مكون النماذج العادي: مربع الاختيار ، الراديو ، كلمة المرور ... // string desc = fi.getString () ؛ System.out.println ("fi.getString ():"+fi.getString ()) ؛ // Second String String desc = fi.getString ("UTF-8") ؛ // تقوم هذه الجملة بتعيين ترميز المحتوى لنظام مكون النماذج العادي. } آخر {// protect: تصفية مكونات الملف الفارغة التي لم يتم تحديدها إذا (fi.getSize () <= 0) {consem ؛ // اقرأ الملف التالي} system.out.println ( c: /users/adl1/desktop/a.txt string ext = fi.getName (). substring (fi.getName (). lastIndexof (".")) ؛ //. اسم ملف السلسلة = uuid+ext ؛ // FILE DIRECTORY CRINKER TECHNOLSTRING DIR1 = Integer.ToHexString (uuid.hashCode () & 0x0F) ؛ string dir2 = integer.toHexString ((uuid.hashCode () & 0xf0) >> 4) ؛ . }}}كسر الرسالة:
كسر النتائج:
ملف 1:
الملف 2:
إظهار مبدأ التحميل التقدم
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.