การอัปโหลดเว็บไฟล์ใช้โพสต์ ซึ่งแตกต่างจากแบบฟอร์มการส่งโพสต์การอัปโหลดไฟล์ต้องตั้งค่าแอตทริบิวต์ Enctype ของแบบฟอร์มเป็นแบบหลายส่วน/ฟอร์ม-ข้อมูล เนื่องจากไฟล์ที่อัปโหลดจะมีขนาดค่อนข้างใหญ่พารามิเตอร์นี้จำเป็นต้องตั้งค่าเพื่อระบุว่าเบราว์เซอร์ใช้การอัปโหลดไบนารี หากไม่ได้ตั้งค่าคุณสมบัติ Enctype จะเริ่มต้นเป็น Application/X-WWW-FORM-URLENCODED การใช้เบราว์เซอร์จะใช้ ASCII เพื่อส่งข้อมูลไปยังเซิร์ฟเวอร์ทำให้เกิดความล้มเหลวในการส่งไฟล์
ในการอัปโหลดไฟล์ให้ใช้โดเมนไฟล์ (<อินพุต type = 'ไฟล์'/> และตั้งค่า Enctype ของฟอร์มเป็น multipart/form-data
หน้าอัปโหลดไคลเอ็นต์จะแสดงในรูป:
รหัส มีดังนี้:
upload.html
<! doctype html public "-// w3c // dtd html 4.01 transitional // en"> <html> <head> <title> ไฟล์อัพโหลด </title> <meta http-equiv = "คำหลัก" http-equiv = "content-type" content = "text/html; charset = utf-8"> <link rel = "stylesheet" type = "text/css" href = "css/style.css"> </head> <body> align = "center"> <br/> <fieldset> <gelend> ไฟล์อัปโหลด </legend> <br/> <div class = 'line'> <div align = 'left'> อัปโหลดไฟล์ 1 </div> <div Align = 'left'> <อินพุต type = "file" file1 "> </div> Align = 'left'> upload ไฟล์ 2 </div> <div align = 'left'> align = 'left'> <อินพุต type = "file" name = "file2"> </div> </div> <div class = 'line'> <div allign = 'left'> คำอธิบาย <div align = 'left'> อัปโหลดไฟล์คำอธิบาย 2 </div> <div align = 'left'> <input type = "text" name = "คำอธิบาย 2"> </div> </div> <div class = 'line'> <div allign = 'left'> ไฟล์คำอธิบาย 2 </div> </div> </div> </fieldset> </div> </form> </body> </html>
รหัสที่ดำเนินการโดยไคลเอนต์นั้นง่ายมากและเซิร์ฟเวอร์นั้นซับซ้อนกว่า ในการรับเนื้อหาคำขอที่ส่งโดยเบราว์เซอร์จะต้องแยกวิเคราะห์ตามรูปแบบที่ระบุโดยโปรโตคอล HTTP
มันเป็นปัญหามากขึ้นในการแยกลำธารไบนารี ห้องสมุดชั้นเรียนจำนวนมากเสร็จสิ้นงานนี้แล้ว ตัวอย่างเช่น SmartUpload และ Apache Commons fileupload.smartupload เป็นไลบรารีคลาสเชิงพาณิชย์ ข้อมูลจะถูกเก็บไว้ในหน่วยความจำในระหว่างการแยกวิเคราะห์กระบวนการร้องขอดังนั้นจึงเร็วขึ้น แต่หน่วยความจำล้นเกิดขึ้นเมื่ออัปโหลดไฟล์ขนาดใหญ่ Apache Commons FilePload เป็นไลบรารีคลาสฟรีและโอเพ่นซอร์ส เฟรมเวิร์กบางอย่างเช่น struts รวมไลบรารีคลาส Apache Common FilePload เพื่อใช้การอัปโหลดไฟล์
ดังแสดงในรูป:
รหัสมีดังนี้:
แพ็คเกจ com.helloweenvsfei.servlet; นำเข้า java.io.file; นำเข้า java.io.fileoutputstream; นำเข้า java.io.ioexception; นำเข้า java.io.inputstream; นำเข้า java.io.outputstream; นำเข้า Java.io.printwriter; javax.servlet.servletexception; นำเข้า javax.servlet.http.httpservlet นำเข้า Javax.servlet.http.httpservletrequest; นำเข้า javax.servlet.http.httpservletresponse; org.apache.commons.fileupload.fileitem; นำเข้า org.apache.commons.fileupload.fileuploadexception; การอัปโหลดระดับสาธารณะในระดับสาธารณะ โมฆะสาธารณะ DOGET (คำขอ httpservletrequest, การตอบสนอง httpservletResponse) พ่น servletexception, ioexception {response.setcharacterencoding ("UTF-8"); Response.getWriter (). println ("โปรดอัปโหลดไฟล์ในโพสต์"); } @suppresswarnings ("ไม่ได้ตรวจสอบ") โมฆะสาธารณะ dopost (คำขอ httpservletrequest, การตอบสนอง httpservletResponse) พ่น servletexception, ioexception {ไฟล์ file1 = null, file2 = null; String Description1 = null, description2 = null; Response.Setcharacterencoding ("UTF-8"); Response.SetContentType ("ข้อความ/html"); PrintWriter out = response.getWriter (); out.println ("<! doctype html สาธารณะ/"-// w3c // dtd html 4.01 transitional // en/">"); out.println ("<html>"); out.println ("<head> <title> a servlet </title> </head>"); out.println ("<link rel = 'stylesheet' type = 'text/css' href = '../css/style.css'>"); out.println ("<body>"); out.println ("<div align = center> <br/>"); out.println ("<fieldset style = 'ความกว้าง: 90%'> <legend> ไฟล์อัปโหลด </gend> <br/>"); out.println ("<div class = 'line'>"); out.println ("<div align = 'left' class = 'leftDiv'> อัพโหลดบันทึก: </div>"); out.println ("<div align = 'left' class = 'rightdiv'>"); // ใช้ diskfileupload object เพื่อแยกวิเคราะห์คำขอ diskfileupload diskfileupload = new diskfileupload (); ลอง {// วางผลลัพธ์ที่แยกวิเคราะห์ในรายการรายการ <EfiLIETEM> list = diskFileUpload.parserequest (คำขอ); out.println ("ติดตามผ่าน fileitems ทั้งหมด ... <br/>"); // ติดตามผ่านรายการ fileItems ทั้งหมดใน fileitem fileitem: list) {ถ้า (fileitem.isformfield ()) {// ถ้าเป็นฟิลด์ข้อความถ้า ("คำอธิบาย 1" .Equals คำอธิบาย 1 = สตริงใหม่ (fileitem.getString (). getBytes (), "UTF-8"); } if ("คำอธิบาย 2" .Equals (fileItem.getFieldName ())) {// ถ้า fileItem เป็นชื่อคือคำอธิบาย 2 out.println ("เดินทางไปยังคำอธิบาย 2 ... <br/>"); คำอธิบาย 2 = สตริงใหม่ (fileitem.getString (). getBytes (), "UTF-8"); }} else {// มิฉะนั้นสำหรับฟิลด์ไฟล์ถ้า ("file1" .equals (fileItem.getFieldName ())) {// วัตถุไฟล์ที่สร้างโดยไฟล์พา ธ ไฟล์ไคลเอ็นต์ไฟล์ file file = ไฟล์ใหม่ (สตริงใหม่ (fileitem.getName () out.println ("เดินทางไปที่ file1 ... <br/>"); out.println ("ตำแหน่งไฟล์ไคลเอนต์:" + RemoteFile.getAbsolutePath () + "<br/>"); // ไฟล์ฝั่งเซิร์ฟเวอร์วางไว้ในโฟลเดอร์อัพโหลด file1 = ไฟล์ใหม่ (this.getServletContext (). getRealPath ("ไฟล์แนบ"), RemoteFile.getName ()); file1.getParentFile (). mkdirs (); file1.createnewfile (); // เขียนไฟล์และเขียนเนื้อหาไฟล์ของ fileItem ลงในไฟล์ inputStream ins = fileItem.getInputStream (); OutputStream ous = new fileOutputStream (file1); ลอง {byte [] buffer = byte ใหม่ [1024]; int len = 0; ในขณะที่ ((len = ins.read (บัฟเฟอร์))> -1) ous.write (บัฟเฟอร์, 0, len); out.println ("บันทึกไฟล์" + file1.getabsolutepath () + "<br/>"); } ในที่สุด {ous.close (); ins.close (); }} if ("file2" .equals (fileItem.getFieldName ())) {// วัตถุไฟล์ที่สร้างโดยไฟล์พา ธ ไฟล์ไคลเอนต์ไฟล์ file file = ไฟล์ใหม่ (สตริงใหม่ (fileItem.getName (). getBytes (), "UTF-8")); out.println ("เดินทางไปที่ file2 ... <br/>"); out.println ("ตำแหน่งไฟล์ไคลเอนต์:" + RemoteFile.getAbsolutePath () + "<br/>"); // ไฟล์ฝั่งเซิร์ฟเวอร์ใส่ในโฟลเดอร์อัพโหลด file2 = ไฟล์ใหม่ (this.getServletContext (). getRealPath ("ไฟล์แนบ"), RemoteFile.getName ()); file2.getParentFile (). mkdirs (); file2.createnewfile (); // เขียนไฟล์และเขียนเนื้อหาไฟล์ของ fileItem ไปยังไฟล์ inputStream ins = fileItem.getInputStream (); OutputStream ous = new fileOutputStream (file2); ลอง {byte [] buffer = byte ใหม่ [1024]; int len = 0; ในขณะที่ ((len = ins.read (บัฟเฟอร์))> -1) ous.write (บัฟเฟอร์, 0, len); out.println ("บันทึกไฟล์" + file2.getabsolutepath () + "<br/>"); } ในที่สุด {ous.close (); ins.close (); }}}} out.println ("การแยกวิเคราะห์คำขอเสร็จสมบูรณ์"); } catch (fileuploadexception e) {// toDo บล็อก catch ที่สร้างโดยอัตโนมัติ e.printstacktrace (); } out.println ("</div>"); out.println ("<div align = 'left' class = 'leftDiv'> file1: </div>"); out.println ("<div align = 'left' class = 'rightdiv'>"); out.println ("<a href = '" + request.getContextPath () + "/ไฟล์แนบ/" + file1.getName () + "' target = _blank>" + file1.getName () + "</a>"); out.println ("</div>"); out.println ("</div>"); } if (file2! = null) {out.println ("<div class = 'line'>"); out.println ("<div align = 'left' class = 'leftDiv'> file2: </div>"); out.println ("<div align = 'left' class = 'rightdiv'>"); out.println ("<a href = '" + request.getContextPath () + "/ไฟล์แนบ/" + urlencoder.encode (file2.getName (), "UTF-8") + "' target = _blank>" file2.getName () + "</a>"); out.println ("</div>"); out.println ("</div>"); } out.println ("<div class = 'line'>"); out.println ("<div align = 'left' class = 'leftDiv'> คำอธิบาย 1: </div>"); out.println ("<div align = 'left' class = 'rightdiv'>"); out.println ("<div align = 'left' class = 'rightdiv'>"); out.println ("<div align = 'left' class = 'leftDiv'> คำอธิบาย 2: </div>"); out.println ("<div align = 'left' class = 'rightdiv'>"); out.println (คำอธิบาย 2); out.println ("</div>"); out.println ("</div>"); out.println ("</fieldset> </div>"); out.println ("</body>"); out.println ("</html>"); out.flush (); out.close (); -เอฟเฟกต์การทำงานของโปรแกรมจะแสดงในรูป:
บทความนี้ได้รวบรวมไว้ใน "สรุปเทคนิคการดำเนินการอัพโหลด Java" และทุกคนยินดีที่จะเรียนรู้และอ่าน
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น