في Javaweb ، يعد التحميل والتنزيل وظيفة شائعة. لتحميل الملف ، يقوم المتصفح بتمرير الملف إلى الخادم في عملية تحميل الملف في عملية دفق. بشكل عام ، تُستخدم حزمة المشاع في filepload لتنفيذ وظيفة التحميل. نظرًا لأن commons-filepload يعتمد على حزمة Commons-IO ، فأنت بحاجة إلى تنزيل هاتين الحزمتين المشتركتين -1 -1.2.1.jar و commons-IO-1.3.2.jar.
1. بناء بيئة
إنشاء مشروع ويب واستيراد الحزمة في المشروع lib
2. تنفيذ تحميل الملف
(الطريقة الأولى للتحميل)
قم بإنشاء صفحة upload.jsp جديدة
<٪@ page language = "java" contentType = "text/html ؛ charset = utf-8" pageencoding = "utf-8" ٪> <! "http://www.w3. المسار المطلق للمشروع ، مما يعني أنه بغض النظر عن نسخ المشروع في المستقبل ، سيجد المسار الدقيق-> <form = "<٪ = request.getContextPath () ٪>/uploadservlet" enctype = "multipart/form-data" method = "post"> <span> حدد ملف: </span> </form> </body> </html>
قم بإنشاء servlet جديد يتولى تحميل الملف
package com.load ؛ import java.io.file ؛ import java.io.ioException ؛ import java.util.list ؛ import javax.servlet.servletcontext ؛ import javax.servletexception ؛ import javax.servlet.annotation.webservled ؛ javax.servlet.http.httpservletrequest ؛ import javax.servlet.http.httpservletrespons org.apache.commons.fileupload.disk.diskfileItemFactory ؛ import org.apache.commons.fileupload.servlet.ServletfilePload ؛@webservlet ("/toploadservlet") التحميلات publicservledservletspletsplet publicloadservlet () {super () ؛ } /* في حزمة FileUpload ، تعتبر عناصر النماذج المعقدة في طلب HTTP ككائن fileItem ؛ * يجب تحليل كائن fileItem بواسطة طريقة parserequest () في فئة servletfileupload* (أي كائن httpservletrequest ملفوف) ، أي أن نموذج النص المحدد وملف التحميل يتم فصله**/usexpection usexception ، طريقة isMultipartContent (): تحليل ما إذا كانت هناك طلبات على الملفات في الطلب ، ismultipart boolean = servletfileupload.ismultipartContent (request) ؛ if (isMultipart) {// إنشاء مصنع مصنع قرص قابلة للتسوية diskfileItemFactory Factory = new DiskfileItemFactory () ؛ // احصل على معلومات السياق الخاصة بـ ServletContext servletContext = request.getServletContext () ؛ // DIRENTORY CACHE ، كل مستودع ملفات الدليل الخاص بالخادم = (ملف) servletContext.getAttribute ("javax.servlet.context.tempdir") ؛ // قم بتعيين Factory.SetRepository الخادم (مستودع) ؛ // يحتاج إنشاء كائن servletFileUpload إلى الاعتماد على FileItemFactory // يحفظ المصنع كائن FileItem FileItem الذي تم الحصول عليه إلى القرص الصلب الخادم ، أي كائن DiskFileItem. servletfileupload تحميل = جديد servletfileupload (المصنع) ؛ جرب {// تحليل كائن httpservletrequest بعد لفه ، وهو فصل نماذج نصية وتحميل ملفات (سيتم لف طلبات http قائمة httpservletrequest) <ireitem> عناصر = upload.parserequest (request) ؛ لـ (fileItem item: العناصر) {String fieldName = item.getFieldName () ؛ اسم ملف السلسلة = item.getName () ؛ string contentType = item.getContentType () ؛ boolean isinmemory = item.isinmemory () ؛ long sizeinbytes = item.getSize () ؛ // instantiate ملف // request.getRealPath (الحصول على ملف المسار الحقيقي) ملف = ملف جديد (request.getRealPath ("/")+"/loads"+filename.substring (filename.lastindexof ("//")+1 ، filename.length ())) ؛ item.write (ملف) ؛ }} catch (fileUploAdexception e) {e.printStackTrace () ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ }}} void dopost المحمية (طلب httpservletrequest ، استجابة httpservletresponse) يلقي servleTexception ، ioException {doget (request ، reponse) ؛ }}(طريقة التحميل الثانية)
قم بإنشاء صفحة JSP جديدة (كما هو مذكور أعلاه ، يتم تغيير المسار فقط)
<٪@ page language = "java" contentType = "text/html ؛ charset = utf-8" pageencoding = "utf-8" ٪> <! "http://www.w3. المسار المطلق للمشروع ، مما يعني أنه بغض النظر عن نسخ المشروع في المستقبل ، فسيجد المسار الدقيق-> <form Action = "<s request.getContextPath () ٪>/uploadservlet1" enctype = "multipart/form-data" method = "post"> <span> selec </form> </body> </html>
إنشاء servlet للتعامل مع التحميل
package com.load ؛ import java.io.file ؛ import java.io.fileOutputStream ؛ import java.io.ioException ؛ import java.io.inputstream ؛ import java.io.outputstream ؛ import javax.servletexception ؛ import javax.servlet.annotation.multipartconfig ؛ javax.servlet.annotation.webservlet ؛ استيراد javax.servlet.http.httpservlet ؛ استيراد javax.servlet.http.httpservletrequest javax.servlet.http.part ؛ webservlet ("/uploadservlet1")@multipartConfig (location = "") exploadservlet1 يمتد httpservlet {private static static final serialversionuid = 1l ؛ public uploadservlet1 () {super () ؛ } DOGED VOID المحمي (طلب httpservletrequest ، استجابة httpservletresponse) يلقي servletexception ، ioException {response.setContentType ("text/html ؛ charset = utf-8") ؛ request.setcharacterencoding ("UTF-8") ؛ // احصل على ملف تحميل وقراءة جزء جزء ملف = request.getPart ("file1") ؛ // تحديد متغير لتلقي اسم ملف سلسلة اسم الملف = null ؛ // disposition: إنه لتوفير اسم ملف افتراضي عندما يريد المستخدم حفظ المحتوى المطلوب كملف // disposition: أخبر المتصفح لفتح الملف عن طريق التنزيل لـ (سلسلة المحتوى: part.getheader ("محتوى disposition"). split (")) {system.out.println (content) ؛ // احصل على اسم الملف if (content.trim (). startswith ("filename")) {// اعتراض اسم الملف fileName = content.subString (content.indexof ('=') + 1) .trim (). استبدال ("/" "،" ") ؛}}} outptream out = null ؛ تقسيم البيانات الأخرى = FileOtputStream جديد ("E: قراءة) ؛(الطريقة الثالثة للتحميل)
يتم استخدام حزمة JSPSMartupload هنا لتحميل وتنزيل. يعتقد المؤلف أن هذا النوع من التحميل والتنزيل بسيط نسبيًا ، لكن يبدو أن الكثير من الناس لا يستخدمونه ولا يفهمونه.
إنشاء صفحة HTML
<! doctype html> <html> <head> <meta http-equiv = "content-type" content = "text/html ؛ charset = utf-8"> <title> ملف تحميل </title> </head> <body> <p> </p align = "center" enctype = "multipart/form-data"> <table align = "center"> <tr> <td> <div align = "center"> 1. <input type = "file" name = "file1"> </viv> </td> </td> <tr> <td> <td> <tr> <td> <div align = "center"> 3. <input type = "file" name = "file3"> </viv> </td> </tr> <tr> <td> <div align = "center"> <input type = "proff"
إنشاء servlet لمعالجة الملفات
package com.load ؛ import java.io.ioException ؛ استيراد java.io.printwriter ؛ استيراد javax.servlet.servletexception ؛ استيراد javax.servlet.annotation.webservlet ؛ import javax.servlet.http.httpservlet ؛ javax.servlet.http.httpservletresponse ؛ import javax.servlet.jsp.jspfactory ؛ import javax.servlet.jsp.pageContext ؛ import com.jspsmart.upload.file ؛ استيراد com.jspsmart.upload.smartuad ؛ com.jspsmart.upload.smartuploadexception ؛ webservlet ("/douploadservlet") تنزيل الفئة العامة يمتد httpservlet {private static final long serialversionuid = 1l ؛ التنزيلات العامة () {super () ؛ } DOGED VOID المحمي (طلب httpservletrequest ، استجابة httpservletresponse) يلقي servletexception ، ioException {response.setContentType ("text/html ؛ charset = utf-8") ؛ printWriter out = response.getWriter () ؛ // قم بإنشاء كائن Smart Upload SmartUpload SU = جديد SmartUpload () ؛ / * * pagecontext pagecontext ؛ جلسة httpsession ؛ تطبيق ServletContext ؛ ServletConfig config ؛ jspwriter خارج. صفحة الكائن = هذا ؛ طلب httpservletrequest ، استجابة httpservletresponse حيث تم إنشاء كائن الصفحة والطلب والاستجابة ، في حين أن الكائنات الخمسة الأخرى التي لم يتم إنشاء مثيل لها يتم إنشاء مثيل لها بالطريقة التالية pagecontext = jspxfactory.getpagecontext (هذا ، طلب ، استجابة ، صواب ، 8192 ، صحيح) ؛ *///احصل على بيئة السياق من خلال JSP Factory Class Pagecontext pagecontext = jspfactory.getDefaultFactory (). // تحميل تهيئة su.initialize (pagecontext) ؛ // upload file try {su.upload () ؛ // حفظ ملف التحميل إلى الدليل المحدد int count = su.save ("/share") ؛ Out.println (count+"تحميل الملف بنجاح! <br>"+su.toString ()) ؛ } catch (SmartUploAdexception e) {E.PrintStackTrace () ؛ }. // إذا لم يكن الملف موجودًا إذا استمر (file.ismissing ()) ؛ // إظهار معلومات الملف الحالية Out.println ("<Table Border = 1>") ؛ Out.println ("<tr> <td> اسم عنصر النموذج (اسم FieldName) </td> </td>"+file.getfieldname ()+"</td> </tr>") ؛ out.println ("<tr> <td> طول الملف </td> <td>"+file.getSize ()+"</td> </tr>") ؛ out.println ("<tr> <td> اسم الملف </td> <td>"+file.getFilename ()+"</td> </tr>") ؛ out.println ("<tr> <td> اسم الملف </td> <td>"+file.getFilename ()+"</td> </tr>") ؛ out.println ("<tr> <td> تمديد الملف </td> <td>"+file.getFileStex ()+"</td> </tr>") ؛ out.println ("<tr> <td> file اسم كامل </td> <td>"+file.getFilePathName ()+"</td> </tr>") ؛ out.println ("</table> <br>") ؛ }} / ** * @see httpservlet#dopost (httpservletrequest request ، httpservletresponse) * / محمية void dopost (httpservletrequest request ، httpservletresponse response) يلقي servleTexception ، ioexception {// todo method googe doget) ؛ }} ملاحظة: Code int count = su.save ("/share") ؛ يعني أنك تحتاج إلى إنشاء مجلد أولاً ، بحيث يمكنك أولاً إنشاء واحد في موقع الويب ، ثم لا تنص على المشروع ، ثم إعادة نشره ، سيتم إنشاء مجلد على جانب التشغيل!
أو يمكنك العثور مباشرة على المسار لتشغيل وإنشاء مجلد المشاركة.
3. تحقيق تنزيل الملف
(تنزيل الملف الأول)
ملاحظة: يصل هذا الرمز مباشرة إلى فئة Servlet
package com.load ؛ import java.io.fileInputStream ؛ import java.io.ioException ؛ import java.io.inputstream ؛ import java.io.outputstream ؛ import javax.servlet.servletexception ؛ import javax.servlet.annotation. javax.servlet.http.httpservletrequest ؛ استيراد javax.servlet.http.httpservletresponse ؛ // استخدم مباشرة http: // localhost: 8080/test1/download to download ، ولكن هذا معيبة. إذا كان هناك صيني في اسم ملف التنزيل ، فسيصبح مشوهًا! webservlet ("/download") تنزيل الفئة العامة يمتد httpservlet {private static static Final Long SerialVersionuid = 1L ؛ التنزيل العام () {super () ؛ } DOGED VOID DOGET (طلب httpservletrequest ، استجابة httpservletresponse) يلقي servleTexception ، ioException {response.setContentType ("text/plain ؛ charset = utf-8") ؛ استجابة. setcharacterencoding ("UTF-8") ؛ Response.Setheader ("الموقع" ، "inchank.txt") ؛ استجابة. outputStream OutputStream = response.getOutputStream () ؛ inputStream inputStream = جديد fileInputStream ("e:/loads"+"/account.txt") ؛ Byte [] Buffer = New Byte [1024] ؛ int i = -1 ؛ بينما ((i = inputStream.Read (buffer))! = -1) {outputStream.write (buffer ، 0 ، i) ؛ } outputStream.flush () ؛ outputStream.Close () ؛ } dopost void المحمي (طلب httpservletrequest ، استجابة httpservletresponse) يلقي servletexception ، ioException {doget (request ، response) ؛ }}(طريقة التنزيل الثانية)
قم بإنشاء صفحة JSP جديدة وحدد التنزيل
<٪@ page language = "java" contentType = "text/html ؛ charset = utf-8" pageencoding = "utf-8" ٪> <! "http://www.w3. href = "../ doDownloadServlet؟ filename = hehe.txt"> انقر لتنزيل </a> </body> </html>
قم بإنشاء فئة Servlet للتنزيل (ملاحظة: إذا كان اسم ملف هذا التنزيل صينيًا ، فسيظل ذلك يتسبب في رمز مشوه)
package com.load ؛ import java.io.bufferedInputStream ؛ import java.io javax.servlet.annotation.webservlet ؛ استيراد javax.servlet.http.httpservlet ؛ استيراد javax.servlet.http.httpservletrequest ؛ استيراد javax.servlet.http.httpletrespresponse ؛ javax.servlet.jsp.pagecontext ؛ استيراد org.hsqldb.lib.stringutil ؛ استيراد com.jspsmart.upload.smartupload ثابت نهائي طويل المسلسل = 1L ؛ doDownloadServlet () {super () ؛ } DOGED VOID DOGED (طلب httpservletrequest ، استجابة httpservletponse) يلقي servletexception ، ioException {// احصل على اسم الملف الذي تم تنزيله // string filename = request.getParameter ("filename") ؛ // string filename = new String (filename.getBytes ("ISO8859-1") ، "UTF-8") ؛ // إنشاء كائن SmartUpload جديد SmartUpload su = new SmartUpload () ؛ pagecontext pagecontext = jspfactory.getDefaultFactory (). getPageContext (هذا ، طلب ، استجابة ، فارغة ، صواب ، 8192 ، صواب) ؛ // تحميل التهيئة su.Initialize (pagecontext) ؛ // تعيين فتح فتح ملف su.setContentDisposition (NULL) ؛ // تنزيل ملف try {su.DownloadFile ("/beader/"+filename) ؛ } catch (SmartUploAdexception e) {// todo catch catch e.printstacktrace () ؛ }} محمية void dopost (طلب httpservletrequest ، استجابة httpservletresponse) يلقي servletexception ، ioException {doget (request ، response) ؛ }}(الطريقة الثالثة للتنزيل)
لن يتم تكرار نفس رمز صفحة JSP على النحو الوارد أعلاه هنا.
قم بإنشاء فئة Serlvet جديدة لتنفيذ وظيفة التنزيل (ملاحظة: حتى إذا كان اسم الملف هو اسم صيني ، فلن تكون هناك مشاكل مشوهة!)
package com.load ؛ import java.io.bufferedInputStream ؛ import java.io javax.servlet.annotation.webservlet ؛ استيراد javax.servlet.http.httpservlet ؛ استيراد javax.servlet.http.httpservletrequest ؛ استيراد javax.servlet.http.httpletrespresponse ؛ javax.servlet.jsp.pagecontext ؛ استيراد org.hsqldb.lib.stringutil ؛ استيراد com.jspsmart.upload.smartupload ثابت نهائي طويل المسلسل = 1L ؛ doDownloadServlet () {super () ؛ } DOGED VOID DOGED (طلب httpservletRequest ، استجابة httpservletresponse) يلقي servleTexception ، ioException {// الحصول على اسم الملف string path1 = request.getParameter ("filename") ؛ // احصل على مسار اسم المسار = request.getSession (). getServletContext (). // PATH عبارة عن ملف مقترع بناءً على مسار السجل واسم الملف. اسم ملف السلسلة = file.getName () ؛ جرب {// judge ما إذا كان IE11 boolean flag = request.getheader ("user-agent"). indexof ("like gecko")> 0 ؛ // ie11 سلسلة وكيل المستخدم: mozilla/5.0 (Windows NT 6.1 ؛ Wow64 ؛ trident/7.0 ؛ rv: 11.0) مثل gecko // ie6 ~ ie10 إصدار المستخدم-العامل: mozilla/5.0 (متوافق ؛ msie 10.0 (طلب. // يتم استخدام اسم الملف هذا لاسم الملف تلقائيًا في FileName filename = new string (filename.replaceall ("" ، "") .getBytes ("UTF-8") ، "ISO8859-1") ؛ // Firefox Browser // Firefox Browser user-Agent String: //mozilla/5.0 (Windows NT 6.1 ؛ Wow64 ؛ RV: 36.0) Gecko/20100101 Firefox/36.0} InputStream Fis = جديد BufferedInputStream (New FileInputStream (path)) ؛ بايت [] المخزن المؤقت ؛ Buffer = New Byte [fis.availival ()] ؛ Fis.Read (Buffer) ؛ fis.close () ؛ استجابة. reset () ؛ استجابة. Response.addheader ("طول المحتوى" ، " + file.length ()) ؛ OutputStream OS = response.getOutputStream () ؛ استجابة. OS.Write (Buffer) ؛ // file file os.flush () ؛ OS.Close () ؛ } catch (ioException e) {E.PrintStackTrace () ؛ } system.out.println (filename) ؛ } dopost void المحمي (طلب httpservletrequest ، استجابة httpservletresponse) يلقي servletexception ، ioException {doget (request ، response) ؛ }}ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.