ตัวอย่างในบทความนี้แบ่งปันไฟล์อัปโหลดและดาวน์โหลดรหัสการใช้งาน Java สำหรับการอ้างอิงของคุณ เนื้อหาเฉพาะมีดังนี้
แผนกต้อนรับ:
1. วิธีการส่ง: โพสต์
2. มีไฟล์ฟอร์มที่อัปโหลดไฟล์ในแบบฟอร์ม: <อินพุต type = "ไฟล์" />
3. ระบุประเภทของแบบฟอร์ม:
ประเภทเริ่มต้น: enctype = "แอปพลิเคชัน/x-www-form-urlencoded"
ประเภทการอัปโหลดไฟล์: Multipart/Form-Data
fileupload
มันมักจะใช้ในการพัฒนาฟังก์ชั่นการอัปโหลดไฟล์และ Apache ยังมีส่วนประกอบการอัปโหลดไฟล์!
ส่วนประกอบ fileupload:
1. ดาวน์โหลดซอร์สโค้ด
2. แนะนำไฟล์ JAR ในโครงการ
Commons-FileUpload-1.2.1.jar [แพ็คเกจการอัปโหลดไฟล์ Core Jar Core Jar]
Commons-io-1.4.jar [คลาสเครื่องมือที่เกี่ยวข้องกับการเย็บปักถักร้อยสำหรับการประมวลผลไฟล์]
ใช้:
คลาสสาธารณะ UploadServlet ขยาย httpservlet {// upload ไดเรกทอรี, บันทึกทรัพยากรที่อัพโหลดโมฆะ public doGET (คำขอ httpservletrequest, httpservletresponse การตอบสนอง) โยน servletexception, ioexception { / ************ โรงงาน = ใหม่ diskfileitemfactory (); // 2. สร้างไฟล์อัพโหลด File Core Tool คลาส servletFilePilePload อัปโหลด = ใหม่ servletFileUpload (โรงงาน); // 1. ตั้งค่าขนาดสูงสุดที่อนุญาตสำหรับไฟล์เดียว: 30m upload.setFilesizeMax (30*1024*1024); // 2. ตั้งค่าขนาดรวมที่อนุญาตสำหรับแบบฟอร์มการอัปโหลดไฟล์: 80m upload.setSizeMax (80*1024*1024); // 3. ตั้งค่าการเข้ารหัสของชื่อไฟล์อัพโหลดชื่อ // เทียบเท่ากับ: request.setcharacterencoding ("UTF-8"); Upload.Setheaderencoding ("UTF-8"); // 3. พิจารณาว่า: แบบฟอร์มปัจจุบันเป็นแบบฟอร์มการอัปโหลดไฟล์หรือไม่หาก (upload.ismultipartContent (คำขอ)) {// 4. แปลงข้อมูลที่ร้องขอเป็นวัตถุ fileItem แล้วห่อหุ้มรายการ <fileItem> รายการ = upload.parserequest (คำขอ); // Traversal: รับข้อมูลที่อัปโหลดแต่ละรายการสำหรับ (FileItem item: list) {// การตัดสิน: ข้อมูลข้อความปกติถ้า (item.isformfield ()) {// สตริงข้อมูลข้อความปกติ fieldName = item.getFieldName (); // รูปแบบองค์ประกอบชื่อสตริงเนื้อหา = item.getString (); // ชื่อองค์ประกอบแบบฟอร์มข้อมูลที่สอดคล้องกัน //item.getString("utf-8 "); ระบุการเข้ารหัส System.out.println (FieldName + "" + เนื้อหา); } // อัปโหลดไฟล์ (สตรีมไฟล์) ---> อัปโหลดไปยังไดเรกทอรีอัปโหลดอื่น ๆ {// สตริงข้อมูลข้อความปกติ fieldName = item.getFieldName (); // รูปแบบองค์ประกอบชื่อสตริงชื่อ = item.getName (); // ชื่อสตริงชื่อไฟล์ = item.getString (); // ชื่อองค์ประกอบแบบฟอร์ม, ประเภทสตริงข้อมูลที่สอดคล้องกัน = item.getContentType (); // ประเภทไฟล์ inputStream ใน = item.getInputStream (); // อัปโหลดสตรีมไฟล์/** 4 ชื่อไฟล์ถูกเปลี่ยนชื่อ* สำหรับผู้ใช้ที่แตกต่างกัน readme.txt ไฟล์ไม่ต้องการเขียนทับ! * การประมวลผลพื้นหลัง: เพิ่มแท็กที่ไม่ซ้ำกันให้กับผู้ใช้! */ // a แบบสุ่มสร้าง id แท็กสตริงที่ไม่ซ้ำกัน = uuid.randomuuid (). toString (); // b. ชื่อประกบด้วยชื่อไฟล์ = id + "#" + ชื่อ; // รับเส้นทางการอัปโหลดฐานพา ธ สตริง = getServletContext (). getRealPath ("/อัปโหลด"); // สร้างไฟล์ไฟล์เป้าหมาย = ไฟล์ใหม่ (พา ธ ชื่อ); // คลาสเครื่องมือ, ไฟล์อัปโหลด item.write (ไฟล์); item.delete (); // ลบไฟล์ชั่วคราวที่สร้างโดยระบบ System.out.println (); }}} else {system.out.println ("แบบฟอร์มปัจจุบันไม่ใช่แบบฟอร์มอัปโหลดไฟล์การประมวลผลล้มเหลว!"); }} catch (exception e) {e.printstacktrace (); }} // การใช้งานด้วยตนเองของกระบวนการอัพโหลดโมฆะส่วนตัว (คำขอ httpservletrequest) โยน ioexception, unsupportencodexception { /* request.getParameter (""); // get/post request.getQueryString (); // รับข้อมูลที่ส่งโดย get request.getInputStream (); // รับข้อมูลที่ส่งโดยโพสต์*//****************** รับข้อมูลแบบฟอร์มการอัปโหลดไฟล์ด้วยตนเอง ************* // 1 รับแบบฟอร์มข้อมูลสตรีม inputstream ใน = request.getInputStream (); // 2. แปลงสตรีม InputStreamReader Instream = ใหม่ inputStreamReader (ใน "UTF-8"); // 3. bufferedReader reader = new bufferedReader (stream); // สตริงข้อมูลเอาต์พุต str = null; ในขณะที่ ((str = reader.readline ())! = null) {system.out.println (str); } // output data string str = null; ในขณะที่ ((str = reader.readline ())! = null) {system.out.println (str); } // close reader.close (); Instream.close (); in.close (); } โมฆะสาธารณะ dopost (คำขอ httpservletrequest, การตอบสนอง httpservletResponse) พ่น servletexception, ioexception {this.doget (คำขอ, การตอบสนอง); -กรณี:
index.jsp
<body> <a href = "$ {pageContext.request.contextpath} /upload.jsp"> การอัปโหลดไฟล์ </a> <a href = "$ {pageContext.request.contextpath}/fileservlet? method = downlistupload.jsp
<body> <form name = "frm_test" action = "$ {pageContext.request.contextpath}/fileservlet? method = upload" method = "post" enctype = "multipart/form-data"> <%-<อินพุตประเภท = "hidden" ชื่อ " <input type = "file" name = "file_img"> <br/> <input type = "subment" value = "ส่ง"> </form> </body>fileservlet.java
/** * จัดการไฟล์อัพโหลดและดาวน์โหลด * @author jie.yuan * */ไฟล์ระดับสาธารณะ Fileservlet ขยาย httpservlet {โมฆะสาธารณะ doget (httpservletrequest คำขอ, httpservletResponse การตอบสนองการใช้งาน if ("อัปโหลด" .equals (วิธีการ)) {// อัปโหลดอัปโหลด (คำขอ, การตอบกลับ); } อื่นถ้า ("downlist" .equals (เมธอด)) {// ป้อนรายการดาวน์โหลด downlist (คำขอ, การตอบกลับ); } อื่นถ้า ("ลง" .Equals (วิธีการ)) {// ดาวน์โหลดลง (คำขอ, การตอบกลับ); }} / ** * 1. อัปโหลด * / โมฆะส่วนตัวอัปโหลด (คำขอ httpservletrequest, การตอบสนอง httpservletResponse) พ่น servletexception, ioexception {ลอง {// 1 สร้างวัตถุโรงงาน filetemfactory = new diskfileitemfactory (); // 2. ไฟล์อัพโหลด File Core Tool คลาส servletFilePilePload อัปโหลด = ใหม่ servletFileUpload (โรงงาน); // ตั้งค่าพารามิเตอร์ขีด จำกัด ขนาดการอัปโหลด SetFilesizEmax (10*1024*1024); // ไฟล์ขนาดไฟล์เดียวอัพโหลด SetsizeMax (50*1024*1024); // การอัพโหลดขนาดไฟล์รวมทั้งหมด Setheaderencoding ("UTF-8"); // การประมวลผลการเข้ารหัสไฟล์ภาษาจีน // ผู้พิพากษาถ้า (upload.ismultipartContent (คำขอ)) {// 3. แปลงข้อมูลคำขอเป็นรายการรวบรวมรายการ <fileitem> list = upload.parserequest (คำขอ); // traversal สำหรับ (fileitem item: list) {// การตัดสิน: ข้อมูลข้อความปกติถ้า (item.isformfield ()) {// รับชื่อสตริงชื่อ = item.getfieldName (); // รับค่าสตริงค่า = item.getString (); System.out.println (ค่า); } // รายการฟอร์มไฟล์อื่น { / ************ การอัปโหลดไฟล์ **************** // a รับชื่อสตริงชื่อไฟล์ = item.getName (); // --- จัดการปัญหาการอัปโหลดชื่อไฟล์ซ้ำชื่อ ---- // A1 รับ id mark string id = uuid.randomuuid (). toString (); // a2. ชื่อไฟล์ splice ชื่อ = id + "#" + ชื่อ; // b. รับสตริงการอัปโหลดสตริง basepath = getServletContext (). getRealPath ("/อัปโหลด"); // c. สร้างวัตถุไฟล์ที่จะอัปโหลดไฟล์ไฟล์ = ไฟล์ใหม่ (basepath, ชื่อ); // d. อัปโหลด item.write (ไฟล์); item.delete (); // ลบไฟล์ชั่วคราวที่สร้างขึ้นเมื่อส่วนประกอบกำลังทำงาน}}}}} catch (Exception e) {E.printStackTrace (); }} / *** 2. ป้อนรายการดาวน์โหลด* / โมฆะส่วนตัวลงรายการลง (คำขอ httpservletRequest, การตอบกลับ httpservletResponse) โยน servletexception, ioexception {// แนวคิดการใช้งาน: ก่อนอื่นให้ได้ชื่อไฟล์ของไฟล์ทั้งหมดในไดเรกทอรีอัพโหลดแล้วบันทึก; ข้ามไปที่รายการ down.jsp เพื่อแสดง // 1 เริ่มต้นแผนที่การรวบรวมแผนที่ <ชื่อไฟล์ที่มีแท็กที่ไม่ซ้ำกันชื่อไฟล์สั้น>; แผนที่ <string, string> filenames = new hashmap <string, string> (); // 2. รับไดเรกทอรีอัปโหลดและชื่อไฟล์ของไฟล์ทั้งหมดภายใต้สตริง bathpath = getServletContext (). getRealPath ("/อัปโหลด"); // ไฟล์ไดเรกทอรีไฟล์ = ไฟล์ใหม่ (bathpath); // ในไดเรกทอรีรายการสตริงชื่อไฟล์ทั้งหมด [] = file.list (); // traversal, encapsulate if (list! = null && list.length> 0) {สำหรับ (int i = 0; i <list.length; i ++) {// ชื่อสตริงชื่อเต็ม = รายการ [i]; // สตริงชื่อสั้นชื่อ shortName = filename.substring (filename.lastindexof ("#")+1); // encapsulate filenames.put (ชื่อไฟล์, ชื่อสั้น); }} // 3. บันทึกเพื่อขอโดเมนคำขอ. setAttribute ("ชื่อไฟล์", ชื่อไฟล์); // 4. forward request.getRequestDispatcher ("/downlist.jsp"). forward (คำขอ, การตอบกลับ); } / *** 3. จัดการดาวน์โหลด* / โมฆะส่วนตัวลง (คำขอ httpservletRequest, การตอบกลับ httpservletResponse) พ่น servletexception, ioexception {// รับชื่อไฟล์ที่ดาวน์โหลดโดยผู้ใช้ (ผนวกข้อมูลหลังจากที่อยู่ URL filename = สตริงใหม่ (filename.getBytes ("ISO8859-1"), "UTF-8"); // รับสตริงเส้นทางการอัปโหลดไดเรกทอรี basepath = getServletContext (). getRealPath ("/upload"); // รับไฟล์สตรีม file inputStream ใน = new fileInputStream (ไฟล์ใหม่ (basepath, filename)); // หากชื่อไฟล์เป็นภาษาจีนการเข้ารหัส URL จะต้องดำเนินการชื่อไฟล์ = urlencoder.encode (ชื่อไฟล์, "UTF-8"); // ตั้งค่าส่วนหัวการตอบกลับสำหรับการตอบสนองการตอบสนอง setheader ("เนื้อหา-การจัดสรร", "ไฟล์แนบ; filename =" + ชื่อไฟล์); // รับการตอบกลับไบต์สตรีม outputStream out = response.getOutputStream (); ไบต์ [] b = ไบต์ใหม่ [1024]; int len = -1; ในขณะที่ ((len = in.read (b))! = -1) {out.write (b, 0, len); } // close out.close (); in.close (); } โมฆะสาธารณะ dopost (คำขอ httpservletrequest, การตอบสนอง httpservletResponse) พ่น servletexception, ioexception {this.doget (คำขอ, การตอบสนอง); -ข้างต้นเป็นเรื่องเกี่ยวกับบทความนี้ฉันหวังว่ามันจะเป็นประโยชน์กับการเรียนรู้ของทุกคน