ใน Javaweb การอัปโหลดและการดาวน์โหลดเป็นฟังก์ชั่นทั่วไป สำหรับการอัปโหลดไฟล์เบราว์เซอร์จะส่งไฟล์ไปยังเซิร์ฟเวอร์ในกระบวนการอัพโหลดไฟล์ในกระบวนการสตรีม โดยทั่วไปแพ็คเกจ Commons-Fileupload ใช้เพื่อใช้ฟังก์ชั่นการอัปโหลด เนื่องจาก Commons-Fileupload นั้นขึ้นอยู่กับแพ็คเกจ Commons-IO คุณต้องดาวน์โหลดแพ็คเกจทั้งสองนี้ Commons-FilePilePload -1.2.1.jar และ Commons-io-1.3.2.jar
1. สร้างสภาพแวดล้อม
สร้างโครงการเว็บและนำเข้าแพ็คเกจลงในโครงการ LIB
2. ใช้การอัปโหลดไฟล์
(วิธีการอัปโหลดครั้งแรก)
สร้างหน้า upload.jsp ใหม่
<%@ page language = "java" contentType = "ข้อความ/html; charset = utf-8" pageencoding = "utf-8"%> <! doctype html สาธารณะ "-// w3c // dtd html 4.01 transitional // en" "http://www.w3.org/tr/html4/loose.dtd"><html><head> <meta http-equiv =" content-type "content =" text/html; charset = utf-8 " เส้นทางที่แน่นอนไปยังโครงการซึ่งหมายความว่าไม่ว่าคุณจะคัดลอกโครงการไปยังที่ใดในอนาคตมันจะค้นหาเส้นทางที่แน่นอน-> <form action = "<%= request.getContextPath ()%>/uploadServlet" enctype = "multipart/form-data" file = "post"> <pan> </form> </body> </html>
สร้างเซิร์ฟเล็ตใหม่ที่จัดการการอัปโหลดไฟล์
แพ็คเกจ com.load; นำเข้า java.io.file; นำเข้า java.io.ioexception; นำเข้า java.util.list; นำเข้า javax.servlet.servletContext; นำเข้า Javax.servlet.servletexception; นำเข้า Javax.servlet.annotation.webservlet; javax.servlet.http.httpservletrequest; นำเข้า Javax.servlet.http.httpservletResponse; นำเข้า org.apache.commons.fileupload.fileitem; นำเข้า org.apache.Commons.fileupload org.apache.commons.fileupload.disk.diskfileitemfactory; นำเข้า org.apache.commons.fileupload.servlet.servletFileUpload; @webservlet ("/uploadservlet") ระดับสาธารณะ uploadservlet Public UploadServlet () {super (); } /* ในแพ็คเกจ FilePload องค์ประกอบฟอร์มที่ซับซ้อนในคำขอ HTTP ถือเป็นวัตถุ FileItem; * วัตถุ FileItem จะต้องแยกวิเคราะห์ด้วยวิธี parserequest () ในคลาส servletfileupload* (นั่นคือวัตถุ httpservletrequest ที่ห่อหุ้ม) นั่นคือรูปแบบข้อความที่เฉพาะเจาะจงและไฟล์อัพโหลดจะถูกแยก** วิธีการ isMultipartContent (): วิเคราะห์ว่ามีคำขอในไฟล์ในคำขอ Boolean isMultipart = servletFilePilePload.ismultipartContent (คำขอ); if (isMultipart) {// สร้างดิสก์ Node Node Factory DiskFileItemFactory Factory = ใหม่ diskFileItemFactory (); // รับข้อมูลบริบทของคำขอ servletContext servletContext = request.getServletContext (); // Cache Directory, repository ไฟล์ไดเรกทอรีเฉพาะเซิร์ฟเวอร์แต่ละตัว = (ไฟล์) servletContext.getAttribute ("javax.servlet.context.tempdir"); // ตั้งค่า Cache Directory ของเซิร์ฟเวอร์โรงงาน SetRepository (ที่เก็บ); // การสร้างวัตถุ ServletFileUpload ต้องขึ้นอยู่กับ FileItemFactory // โรงงานบันทึกวัตถุไฟล์อัพโหลดไฟล์ FileItem ที่ได้รับไปยังฮาร์ดดิสก์เซิร์ฟเวอร์นั่นคือวัตถุ DiskFileItem ServletFileUpload Upload = ใหม่ servletFilePilePload (โรงงาน); ลอง {// แยกวิเคราะห์วัตถุ httpservletRequest หลังจากถูกห่อซึ่งคือการแยกแบบฟอร์มข้อความและอัปโหลดไฟล์ (คำขอ http จะถูกห่อหุ้มเป็น httpservletrequest) รายการ <fileitem> รายการ = upload.parserequest (คำขอ); สำหรับ (FileItem item: items) {String fieldName = item.getFieldName (); String filename = item.getName (); String ContentType = item.getContentType (); บูลีน isinmemory = item.isinmemory (); long sizeinbytes = item.getSize (); // ตัวอย่างไฟล์ // request.getRealPath (รับไฟล์ PATH จริง) ไฟล์ไฟล์ = ไฟล์ใหม่ (request.getRealPath ("/")+"/โหลด"+filename.substring (filename.lastindexof ("//")+1, filename.length ()); item.write (ไฟล์); }} catch (fileuploadexception e) {e.printstacktrace (); } catch (exception e) {e.printstacktrace (); }}} void dopost ที่ได้รับการป้องกัน (คำขอ httpservletRequest, การตอบสนอง httpservletResponse) โยน servletexception, ioexception {doGet (คำขอ, การตอบสนอง); -(วิธีการอัปโหลดครั้งที่สอง)
สร้างหน้า JSP ใหม่ (เช่นเดียวกับด้านบนเพียงเส้นทางที่เปลี่ยนไป)
<%@ page language = "java" contentType = "ข้อความ/html; charset = utf-8" pageencoding = "utf-8"%> <! doctype html สาธารณะ "-// w3c // dtd html 4.01 transitional // en" "http://www.w3.org/tr/html4/loose.dtd"><html><head> <meta http-equiv =" content-type "content =" text/html; charset = utf-8 " เส้นทางที่แน่นอนไปยังโครงการซึ่งหมายความว่าไม่ว่าคุณจะคัดลอกโครงการในอนาคตจะพบเส้นทางที่แน่นอน-> <form action = "<%= request.getContextPath ()%>/uploadServlet1" enctype = "multipart/form-data" file = "post"> <pan> </form> </body> </html>
สร้าง servlet เพื่อจัดการการอัปโหลด
แพ็คเกจ com.load; นำเข้า java.io.file; นำเข้า java.io.fileoutputstream; นำเข้า java.io.ioexception; นำเข้า java.io.InputStream; นำเข้า java.io.OutputStream; นำเข้า Javax.servlet.servletexception; javax.servlet.annotation.webservlet; นำเข้า javax.servlet.http.httpservlet; นำเข้า Javax.servlet.http.httpservletrequest นำเข้า javax.servlet.http.httpservletresponse; javax.servlet.http.part; @webservlet ("/uploadservlet1")@multipartConfig (ตำแหน่ง = "") คลาสสาธารณะอัปโหลด Servlet1 ขยาย httpservlet {ส่วนตัวคงที่ Public UploadServlet1 () {super (); } void doget ที่ได้รับการป้องกัน (คำขอ httpservletrequest, การตอบสนอง httpservletResponse) พ่น servletexception, ioexception {response.setContentType ("ข้อความ/html; charset = utf-8"); request.Setcharacterencoding ("UTF-8"); // รับไฟล์อัปโหลดและอ่านส่วนไฟล์ส่วน = request.getPart ("file1"); // กำหนดตัวแปรเพื่อรับชื่อไฟล์สตริงชื่อไฟล์ = null; // content-disposition: มันคือการระบุชื่อไฟล์เริ่มต้นเมื่อผู้ใช้ต้องการบันทึกเนื้อหาที่ร้องขอเป็นไฟล์ // content-disposition: บอกเบราว์เซอร์ให้เปิดไฟล์โดยการดาวน์โหลด (เนื้อหาสตริง: part.getheader ("เนื้อหา-การจัดสรร"). แยก (";")) {system.out.println (เนื้อหา); // รับชื่อไฟล์ถ้า (content.trim (). startswith ("filename")) {// intercept ชื่อไฟล์ filename = content.substring (content.indexof ('=') + 1) .trim () แทนที่ ("/" "," "); การหารและข้อมูลอื่น ๆ ออกไป = FileOdputStream (ไฟล์ใหม่ ("E:/LOADS" + File.Sparator + Filename); } system.out.println ("ไฟล์ใหม่" + filename + "ที่สร้างขึ้นที่" + "/loads");(วิธีการอัพโหลดที่สาม)
แพ็คเกจ JSPSMartUpload ใช้ที่นี่เพื่ออัปโหลดและดาวน์โหลด ผู้เขียนเชื่อว่าการอัปโหลดและดาวน์โหลดแบบนี้ค่อนข้างง่าย แต่ดูเหมือนว่าหลายคนไม่ได้ใช้และไม่เข้าใจ
สร้างหน้า html
<! doctype html> <html> <head> <meta http-equiv = "content-type" content = "text/html; charset = utf-8"> <title> ไฟล์อัปโหลด </title> </head> <body> enctype = "multipart/form-data"> <table align = "center"> <tr> <td> <div align = "center"> 1. <อินพุต type = "file" name = "file1"> </div> </td> </tr> <tr> <td> <tr> <td> <div align = "center"> 3. <อินพุต type = "file" name = "file3"> </div> </td> </> <tr> <td> <div Align = "center"> <อินพุตประเภท = "ส่ง" name = "submit" value = "อัปโหลดเขา">
สร้าง servlet เพื่อประมวลผลไฟล์อัปโหลด
แพ็คเกจ com.load; นำเข้า java.io.ioexception; นำเข้า java.io.printwriter; นำเข้า javax.servlet.servletexception; นำเข้า Javax.servlet.annotation.webservlet; นำเข้า javax.servlet.http.httpservlet; javax.servlet.http.httpservletResponse; นำเข้า Javax.servlet.jsp.jspfactory; นำเข้า Javax.servlet.jsp.pagecontext; นำเข้า com.jspsmart.upload.file; com.jspsmart.upload.smartuploadexception; @webservlet ("/douploadservlet") การดาวน์โหลดคลาสสาธารณะ servlet ขยาย httpservlet {ส่วนตัวคงที่ long serialversionuid = 1l; Public DownloadServlet () {super (); } void doget ที่ได้รับการป้องกัน (คำขอ httpservletrequest, การตอบสนอง httpservletResponse) พ่น servletexception, ioexception {response.setContentType ("ข้อความ/html; charset = utf-8"); PrintWriter out = response.getWriter (); // สร้างวัตถุอัพโหลดอัจฉริยะใหม่ smartupload su = new smartupload (); / * * pagecontext pagecontext; เซสชั่น httpsession; แอปพลิเคชัน ServletContext; servletConfig config; jspwriter ออก; หน้าวัตถุ = สิ่งนี้; คำขอ httpservletRequest, การตอบสนอง httpservletResponse โดยที่วัตถุหน้าคำขอและการตอบกลับได้รับการสร้างอินสแตนซ์ในขณะที่วัตถุอีก 5 ชิ้นที่ไม่ได้สร้างอินสแตนซ์ในแบบอินสแตนซ์ในวิธีต่อไปนี้ pagecontext = jspxfactory.getPageContext */// รับสภาพแวดล้อมบริบทผ่าน JSP Class PageContext PageContext = jspfactory.getDefaultFactory (). getPageContext (นี่, คำขอ, การตอบสนอง, null, true, 8192, true); // อัปโหลดเริ่มต้น su.initialize (pageContext); // อัปโหลดไฟล์ลอง {su.upload (); // บันทึกไฟล์อัปโหลดไปยังไดเรกทอรีที่ระบุจำนวน int count = su.save ("/share"); out.println (count+"การอัปโหลดไฟล์สำเร็จ! <br>"+su.toString ()); } catch (smartuploadexception e) {e.printstacktrace (); } // แยกข้อมูลไฟล์อัปโหลดทีละตัวสำหรับ (int i = 0; i <su.getFiles (). getCount (); i ++) {ไฟล์ไฟล์ = su.getFiles (). getFile (i); // หากไฟล์ไม่มีอยู่ถ้า (file.ismissing ()) ดำเนินการต่อ; // แสดงข้อมูลไฟล์ปัจจุบันออกมา 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.getFileExt ()+"</td> </tr>"); out.println ("<tr> <td> ไฟล์ชื่อเต็ม </td> <td>"+file.getFilePathName ()+"</td> </tr>"); out.println ("</table> <br>"); }} / ** * @See httpservlet#dopost (คำขอ httpservletrequest, การตอบสนอง httpservletResponse) * / การป้องกันโมฆะ dopost (httpservletrequest คำขอ, httpservletResponse การตอบสนอง) - หมายเหตุ: รหัส int count = su.save ("/share"); หมายความว่าคุณต้องสร้างโฟลเดอร์ก่อนดังนั้นคุณสามารถสร้างหนึ่งในเว็บคอนท์เตอร์จากนั้นยกเลิกการใช้งานโครงการแล้วนำไปใช้ใหม่ในโฟลเดอร์จะถูกสร้างขึ้นที่ด้านการรัน!
หรือคุณสามารถค้นหาเส้นทางที่จะเรียกใช้และสร้างโฟลเดอร์แชร์โดยตรง
3. ตระหนักถึงการดาวน์โหลดไฟล์
(ดาวน์โหลดไฟล์แรก)
หมายเหตุ: รหัสนี้เข้าถึงคลาส servlet โดยตรง
แพ็คเกจ com.load; นำเข้า java.io.fileinputstream; นำเข้า java.io.ioexception; นำเข้า java.io.inputstream; นำเข้า java.io.OutputStream; นำเข้า javax.servlet.servletexception; นำเข้า Javax.servlet.servlet.servlet. javax.servlet.http.httpservletrequest; นำเข้า Javax.servlet.http.httpservletResponse; // ใช้ http: // localhost: 8080/test1/ดาวน์โหลดเพื่อดาวน์โหลด แต่สิ่งนี้มีข้อบกพร่อง หากมีภาษาจีนในชื่อไฟล์ดาวน์โหลดมันจะกลายเป็นอ่านไม่ออก! @webservlet ("/ดาวน์โหลด") การดาวน์โหลดคลาสสาธารณะขยาย httpservlet {ส่วนตัวคงที่สุดท้าย Long SerialVersionUid = 1l; ดาวน์โหลดสาธารณะ () {super (); } void doget ที่ได้รับการป้องกัน (คำขอ httpservletRequest, การตอบสนอง httpservletResponse) พ่น servletexception, ioexception {response.setContentType ("ข้อความ/ธรรมดา; charset = utf-8"); Response.Setcharacterencoding ("UTF-8"); Response.Setheader ("ตำแหน่ง", "chinese.txt"); Response.SetheAder ("เนื้อหา-การจัดสรร", "เอกสารแนบ; ชื่อไฟล์ =" + "account.txt"); OutputStream outputStream = response.getOutputStream (); inputStream inputStream = new FileInputStream ("E:/loads"+"/account.txt"); ไบต์ [] บัฟเฟอร์ = ไบต์ใหม่ [1024]; int i = -1; ในขณะที่ ((i = inputstream.read (บัฟเฟอร์))! = -1) {outputStream.write (บัฟเฟอร์, 0, i); } outputStream.flush (); outputstream.close (); } การป้องกันโมฆะ dopost (คำขอ httpservletRequest, การตอบสนอง httpservletResponse) พ่น servletexception, ioexception {doget (คำขอ, การตอบสนอง); -(วิธีการดาวน์โหลดครั้งที่สอง)
สร้างหน้า JSP ใหม่และเลือกดาวน์โหลด
<%@ page language = "java" contentType = "ข้อความ/html; charset = utf-8" pageencoding = "utf-8"%> <! doctype html สาธารณะ "-// w3c // dtd html 4.01 transitional // en" "http://www.w3.org/tr/html4/loose.dtd"><html> <head> <meta http-equiv =" content-ype "content =" ข้อความ/html; charset = utf-8 " href = "../ dodownloadservlet? filename = hehe.txt"> คลิกเพื่อดาวน์โหลด </a> </body> </html>
สร้างคลาส servlet เพื่อดาวน์โหลด (หมายเหตุ: หากชื่อไฟล์ของการดาวน์โหลดนี้เป็นภาษาจีนมันจะยังคงทำให้เกิดรหัสที่อ่านไม่ออก)
แพ็คเกจ com.load; นำเข้า java.io.bufferedInputStream; นำเข้า java.io.file; นำเข้า java.io.fileinputstream; นำเข้า java.io.ioException; นำเข้า java.io.inputstream; นำเข้า java.io.outputstream; javax.servlet.annotation.webservlet; นำเข้า javax.servlet.http.httpservlet; นำเข้า Javax.servlet.http.httpservletrequest นำเข้า javax.servlet.http.htttpservletresponse; javax.servlet.jsp.pageContext; นำเข้า org.hsqldb.lib.stringutil; นำเข้า com.jspsmart.upload.smartupload; นำเข้า com.jspsmart.upload.smartuploadexception; serialVersionUid = 1L; สาธารณะ dodownloadservlet () {super (); } void doget ที่ได้รับการป้องกัน (คำขอ httpservletRequest, การตอบกลับ httpservletResponse) พ่น servletexception, ioexception {// รับชื่อของไฟล์ที่ดาวน์โหลดมา // string filename = request.getParameter ("filename"); // string filename = สตริงใหม่ (ชื่อ filename.getBytes ("ISO8859-1"), "UTF-8"); // สร้างวัตถุ SmartUpload ใหม่ SmartUpload SU = ใหม่ smartUpload (); pageContext pageContext = jspfactory.getDefaultFactory (). getPageContext (สิ่งนี้, คำขอ, การตอบสนอง, null, true, 8192, true); // อัปโหลดการเริ่มต้น su.initialize (pageContext); // ตั้งค่าห้ามการเปิดไฟล์ su.setContentDisposition (NULL); // ดาวน์โหลดไฟล์ลอง {su.downloadfile ("/listener/"+ชื่อไฟล์); } catch (smartuploadexception e) {// toDo บล็อก catch ที่สร้างโดยอัตโนมัติ E.PrintStackTrace (); }} การป้องกันโมฆะ dopost (คำขอ httpservletRequest, การตอบสนอง httpservletResponse) พ่น ServleTexception, iOexception {doget (คำขอ, การตอบสนอง); -(วิธีการดาวน์โหลดที่สาม)
รหัสหน้า JSP เดียวกันกับด้านบนจะไม่ถูกทำซ้ำที่นี่
สร้างคลาส Serlvet ใหม่เพื่อใช้ฟังก์ชั่นการดาวน์โหลด (หมายเหตุ: แม้ว่าชื่อไฟล์จะเป็นชื่อภาษาจีน แต่ก็จะไม่มีปัญหาที่อ่านไม่ออก!)
แพ็คเกจ com.load; นำเข้า java.io.bufferedInputStream; นำเข้า java.io.file; นำเข้า java.io.fileinputstream; นำเข้า java.io.ioException; นำเข้า java.io.inputstream; นำเข้า java.io.outputstream; javax.servlet.annotation.webservlet; นำเข้า javax.servlet.http.httpservlet; นำเข้า Javax.servlet.http.httpservletrequest นำเข้า javax.servlet.http.htttpservletresponse; javax.servlet.jsp.pageContext; นำเข้า org.hsqldb.lib.stringutil; นำเข้า com.jspsmart.upload.smartupload; นำเข้า com.jspsmart.upload.smartuploadexception; serialVersionUid = 1L; สาธารณะ dodownloadservlet () {super (); } void doget ที่ได้รับการป้องกัน (คำขอ httpservletRequest, การตอบสนอง httpservletResponse) พ่น servletexception, ioexception {// รับสตริงชื่อไฟล์ path1 = request.getParameter ("ชื่อไฟล์"); // รับ PATH NAME String Path = request.getSession (). getServletContext (). getRealPath ("/listener/"+path1); // พา ธ เป็นไฟล์ประกบตามเส้นทางบันทึกและชื่อไฟล์ String filename = file.getName (); ลอง {// ตัดสินว่าเป็น 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 เวอร์ชัน user-agent สตริง: mozilla/5.0 (เข้ากันได้; msie 10.0; windows nt 6.0; (request.getheader ("user-agent"). toLowerCase (). indexof ("msie")> 0 || แฟล็ก) {filename = urlencoder.encode (ชื่อไฟล์, "utf-8"); // ชื่อไฟล์นี้ใช้สำหรับชื่อไฟล์ที่แสดงโดยอัตโนมัติในกล่องดาวน์โหลดกล่องดาวน์โหลดของเบราว์เซอร์ = สตริงใหม่ (filename.replaceall ("", "") .getBytes ("UTF-8"), "iso8859-1"); // เบราว์เซอร์ Firefox // Firefox Browser String ผู้ใช้ Agent String: //mozilla/5.0 (Windows NT 6.1; wow64; rv: 36.0) Gecko/20100101 Firefox/36.0} inputstream FIS = ใหม่ bufferedInputStream ไบต์ [] บัฟเฟอร์; บัฟเฟอร์ = ไบต์ใหม่ [fis.available ()]; fis.read (บัฟเฟอร์); fis.close (); Response.reset (); Response.addheader ("เนื้อหา-การจัดสรร", "ไฟล์แนบ; ชื่อไฟล์ =" +ชื่อไฟล์); response.addheader ("ความยาวเนื้อหา", "" + file.length ()); OutputStream OS = Response.GetOutputStream (); Response.SetContentType ("แอปพลิเคชัน/octet-stream"); OS.WRITE (บัฟเฟอร์); // ไฟล์เอาต์พุต OS.FLUSH (); os.close (); } catch (ioexception e) {e.printstacktrace (); } system.out.println (ชื่อไฟล์); } การป้องกันโมฆะ dopost (คำขอ httpservletRequest, การตอบสนอง httpservletResponse) พ่น servletexception, ioexception {doget (คำขอ, การตอบสนอง); -ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น