1. تحليل مبدأ تحميل الملف
1. المتطلبات الأساسية اللازمة لتحميل الملف
أ. يجب أن تكون طريقة النموذج
ب. يجب أن تكون خاصية enctype من النموذج من نوع multipart/form-data.
القيمة الافتراضية لـ enctype: التطبيق/x-www-form-urlencoded
الوظيفة: أخبر الخادم بنوع MIME لنص الطلب
Application/X-WWW-Form-urlencoded: username = ABC & Password = 123
servletRequest.getParameter (اسم السلسلة) ؛ هذه الطريقة هي طريقة تقرأ هذا النوع على وجه التحديد
multipart/form-data:
2. استخدم مكون المشاع filepload لتحميل الملفات
أ. انسخ حزمة الجرة: commons-fileupload.jar commons-io.jar
ب. مبدأ التنفيذ
3. مشكلة رمز القمامة
أ. رمز القمامة للحقول العادية
fileItem.getString (سلسلة charset) ؛ يجب أن يكون الترميز متسقًا مع العميل
ب. اسم الملف الصيني الذي تم تحميله مشوه.
request.setcharacterencoding ("UTF-8") ؛ يجب أن يكون الترميز متسقًا مع العميل
4. تنفيذ محدد
رمز مكتب الاستقبال. jsp كما يلي
<٪@ page language = "java" import = "java.util.*" pageencoding = "utf-8" ٪> <! doctype html public "-// w3c // dtd html 4.01 transitional // en"> <html> <head> upload </title> content = "no-cache"> <meta http-equiv = "cache-control" content = "no-cache"> <meta http-equiv = "expires" content = "0"> <!-<link rel = "stylesheet" type = "text/css" href = Action = "$ {pagecontext.request.contextpath}/servlet/eploadservlet3" method = "post" enctype = "multipart/form-data"> name: <input name = "name"/> <br/> file1: <input type = "file" name = "f1"/> <br/> file2: اكتب = "إرسال" value = "topload"> </pump> </body> </html>رمز سيرفيليت الخلفية
package com.itheima.servlet ؛ import java.io.file ؛ import java.io.ioException ؛ import java.io.printwriter ؛ import java.io.usupportedencodexception ؛ import java.util.list ؛ import java.util.uud ؛ import javax.servlet. javax.servlet.http.httpservlet ؛ استيراد javax.servlet.http.httpletrequest org.apache.commons.fileupload.fileuploadbase ؛ import org.apache.commons.fileupload.fileuploadexception ؛ import org.apache.commons.filepload.disk.diskfileitemfactory ؛ org.apache.commons.io.filenameUtils ؛ // شرح مفصل للفئة العامة exploadServlet3 {request.setcharacterencoding ("utf-8") ؛ response.setContentType ("text/html ؛ charset = utf-8") ؛ printWriter out = response.getWriter () ؛ system.out.print (request.getRemoteadDr ()) ؛ boolean isMultipart = servletfileupload.ismultipartcontent (طلب) ؛ إذا (! isMultipart) servletfileupload (dfif) ؛ // parser.setFilesizeMax (3*1024*1024) ؛ // اضبط حجم تحميل ملف واحد // parser.setsizemax (6*1024*1024) ؛ parser.parserequest (request) ؛} catch (fileuploadbase.filesizeLimitexceedEdException e) {out.write ("UploadFile يتجاوز 3M") ؛ return ؛} catch {E.PrintStackTrace () ؛ قم برمي RunTimeException جديد ("فشل محتوى التحميل في التحميل ، يرجى المحاولة مرة أخرى") ؛} // معالجة المحتوى المطلوب إذا (العناصر! = null) {for (fileItem ite: items) {if (item.isformfield ()) {processformfield (item) ؛ ProcessUploAdfield (fileItem item) {try {string filename = item.getName () ؛ // if (filename! = null &&! filename.equals ("")) {fileName = uuid.randomuid (). filenameUtils.getExtense (filename) ؛ // نوع mime type contentType = item.getContentType () ؛ if (contentType.Startswith ("image/")) {// date now = new date () ؛ احسب دليل التخزين وفقًا لرمز hashcode لسلسلة اسم الملف childdirectory = makechilddirectory (getServletContext (). getRealPath ("/web-inf/") ملف (storedirectorypath) ؛ if (! storedirectory.exists ()) {storedirectory.mkdirs () ؛ السلسلة الفرعية الفرعية المخزنة makechilddirectory (سلسلة realpath ، اسم ملف السلسلة) {int hashcode = filename.hashCode () ؛ int dir1 = hashcode & 0xf ؛ // take 1 ~ 4 bits int dir2 = (hashcode & 0xf0) >> ملف (RealPath ، الدليل) ؛ if (! file.exists ()) file.mkdirs () ؛ إرجاع الدليل ؛} pROCESS PROCESSFORMFILEFField (fileItem item) {string fieldName = item.getfieldname () ؛ RunTimeException ("ترميز UTF-8 غير مدعوم")) ؛} system.out.println (fieldName+"="+fieldvalue) ؛} public void dopost (httpservletrequest request ، httpservletresponse) يلقي servlexception ، ioexception5. فيما يتعلق بالوثائق المؤقتة
أ. DiskfileItemFactory
public void setRepository (مستودع الملفات): قم بتعيين الدليل حيث يتم تخزين الملفات المؤقتة الفراغ العام setSizeSethReshold (int sizethreshold): اضبط حجم ذاكرة التخزين المؤقت
ب.
عند تحميل الملفات ، استخدم دفق IO لمعالجتها بنفسك. تأكد من حذف الملف المؤقت بعد إغلاق الدفق. fileitem.delete ()
يوصى باستخدام: fileitem.writer (ملف f). سيتم حذف الملفات المؤقتة تلقائيًا.
6. الحد من حجم الملف
أ.
servletfileupload.setfilesizemax (3*1024*1024) ؛ // اضبط حجم تحميل ملف واحد
ب.
servletfileupload.setsizemax (6*1024*1024) ؛ // إجمالي الحد الأقصى للحجم عند تحميل ملفات متعددة
ما ورد أعلاه هو رمز المثال لعملية تحميل ملف Commons FileUpload التي قدمها المحرر. آمل أن يكون ذلك مفيدًا للجميع. إذا كان لديك أي أسئلة ، فيرجى ترك رسالة لي وسوف يرد المحرر على الجميع في الوقت المناسب. شكرا جزيلا لدعمكم لموقع wulin.com!