1. การวิเคราะห์หลักการของการอัปโหลดไฟล์
1. ข้อกำหนดเบื้องต้นที่จำเป็นสำหรับการอัปโหลดไฟล์
. วิธีการของแบบฟอร์มจะต้องโพสต์
ข. คุณสมบัติ Enctype ของแบบฟอร์มจะต้องเป็นประเภท multipart/form-data
ค่าเริ่มต้นของ Enctype: Application/X-WWW-FORM-URLENCODED
ฟังก์ชั่น: บอกเซิร์ฟเวอร์เกี่ยวกับประเภท MIME ของข้อความคำขอ
แอปพลิเคชัน/x-www-form-urlencoded: username = abc & password = 123
ServletRequest.getParameter (ชื่อสตริง); วิธีนี้เป็นวิธีที่อ่านประเภทนี้โดยเฉพาะ
multipart/form-data:
2. ใช้ส่วนประกอบคอมมอนส์-ฟิลด์อัปโหลดเพื่ออัปโหลดไฟล์
. คัดลอกแพ็คเกจ JAR: 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> <head> content = "no-cache"> <meta http-equiv = "cache-control" content = "no-cache"> <meta http-equiv = "หมดอายุ" content = "0"> <! action = "$ {pageContext.request.contextpath}/servlet/uploadservlet3" เมธอด = "โพสต์" enctype = "multipart/form-data"> ชื่อ: <name name = "name"/> <br/> file1: <อินพุตประเภท = value = "upload"> </form> </body> </html>รหัส Servlet พื้นหลัง
แพ็คเกจ com.itheima.servlet; นำเข้า java.io.file; นำเข้า java.io.ioexception; นำเข้า java.io.printwriter; นำเข้า java.io.usupportencodingexception; นำเข้า java.util.list; นำเข้า Java.util.uuid; javax.servlet.http.httpservlet; นำเข้า javax.servlet.http.httpservletrequest นำเข้า javax.servlet.http.httpservletResponse; นำเข้า org.apache.commons.fileupload.fileitem; org.apache.commons.fileupload.fileuploadexception; นำเข้า org.apache.commons.fileupload.disk.diskfileitemfactory; นำเข้า org.apache.commons.fileupload.servlet.servletfileupload; UploadServlet3 ขยาย httpservlet {public void doget (httpservletrequest Request, httpservletResponse การตอบสนอง) โยน servletexception, ioexception {request.setcharacterencoding ("UTF-8"); Response.set Response.getWriter (); System.out.print (request.getRemoteaddr ()); บูลีน ismultipart = servletfileupload.ismultipartcontent (คำขอ); ถ้า (! diskfileitemfactory (); servletfileupload parser = ใหม่ servletfileupload (dfif); // parser.setFilesizeMax (3*1024*1024); // ตั้งค่าขนาดของไฟล์เดียวเมื่ออัปโหลด // parser.setsizemax (6*1024*1024*1024); {items = parser.parserequest (คำขอ);} catch (fileuploadbase.filesizeLimitexceedeDexception e) {out.write ("uploadfile เกิน 3m"); return; {e.printstacktrace (); โยน runtimeException ใหม่ ("เนื้อหาการอัปโหลดแยกวิเคราะห์ล้มเหลวโปรดลองอีกครั้ง");} // ประมวลผลเนื้อหาที่ร้องขอถ้า (รายการ! = null) {สำหรับ (รายการ fileitem: รายการ) {ถ้า (item.isformfield ()) {processFormfield (รายการ); ProcessUploadField (รายการ fileItem) {ลอง {String filename = item.getName (); // ถ้า (filename! = null &&! filename.equals ("")) {filename = uuid.randomuIid () toString ()+"_" filenameutils.getExtension (ชื่อไฟล์); // ประเภทสตริง mime contentType = item.getContentType (); ถ้า (contentType.startswith ("image/")) {// วันที่ = วันที่ใหม่ (); คำนวณไดเรกทอรีการจัดเก็บตาม hashcode ของชื่อไฟล์สตริง childDirectory = makechildDirectory (getServletContext (). getRealPath ("/web-inf/files/"), ชื่อไฟล์); String retorectorypath = getServletContext () if (! storedirectory.exists ()) {storedirectory.mkdirs ();} system.out.println (filename); ite (ไฟล์ใหม่ (redirectorypath+file.Sparator+filename); // ลบไฟล์ชั่วคราว}}}}}}}}}}}}}}}} คำนวณสตริงย่อยส่วนตัวที่เก็บไว้ makechildDirectory (String realpath, String filename) {int hashCode = filename.hashCode (); int dir1 = hashcode & 0xf; // ใช้ 1 ~ 4 bits int diR2 = (hashcode & 0xf0) >> = ไฟล์ใหม่ (realpath, ไดเรกทอรี); if (! file.exists ()) file.mkdirs (); ไดเรกทอรีส่งคืน;} โมฆะส่วนตัว processFormfield (รายการ fileItem) {สตริง fieldName = item.getFieldName (); // ชื่อฟิลด์ RuntimeException ("การเข้ารหัส UTF-8 ไม่รองรับ");} system.out.println (fieldName+"="+fieldValue);} โมฆะสาธารณะ dopost (httpservletRequest คำขอ, httpservletResponse)5. เกี่ยวกับเอกสารชั่วคราว
. diskfileitemfactory
โมฆะสาธารณะ setRepository (ที่เก็บไฟล์): ตั้งค่าไดเรกทอรีที่ไฟล์ชั่วคราวถูกเก็บไว้
ข.
เมื่ออัปโหลดไฟล์ให้ใช้ IO Stream เพื่อประมวลผลด้วยตัวเอง ตรวจสอบให้แน่ใจว่าได้ลบไฟล์ชั่วคราวหลังจากปิดสตรีม fileitem.delete ()
ขอแนะนำให้ใช้: fileitem.writer (ไฟล์ f) ไฟล์ชั่วคราวจะถูกลบโดยอัตโนมัติ
6. จำกัด ขนาดไฟล์
.
ServletFileUpload.setFilesizeMax (3*1024*1024); // ตั้งค่าขนาดของการอัปโหลดไฟล์เดียว
ข.
ServletFileUpload.SetSizeMax (6*1024*1024); // ขีด จำกัด ขนาดรวมเมื่ออัปโหลดหลายไฟล์
ข้างต้นเป็นรหัสตัวอย่างสำหรับไฟล์การใช้งานไฟล์ Commons FilePload การอัปโหลดที่แนะนำโดยตัวแก้ไข ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน หากคุณมีคำถามใด ๆ โปรดฝากข้อความถึงฉันและบรรณาธิการจะตอบกลับทุกคนในเวลา ขอบคุณมากสำหรับการสนับสนุนเว็บไซต์ Wulin.com!