ในการพัฒนาเว็บแอปพลิเคชันฟังก์ชั่นการอัปโหลดและดาวน์โหลดไฟล์เป็นฟังก์ชั่นที่ใช้กันทั่วไป บทความต่อไปนี้จะแนะนำคุณเกี่ยวกับคำอธิบายโดยละเอียดเกี่ยวกับการอัปโหลดและดาวน์โหลดไฟล์ Javaweb
สำหรับการอัปโหลดไฟล์เบราว์เซอร์จะส่งไฟล์ไปยังเซิร์ฟเวอร์ในรูปแบบของสตรีมระหว่างกระบวนการอัปโหลด มันเป็นปัญหามากขึ้นหากคุณใช้ Servlet โดยตรงเพื่อรับสตรีมอินพุตของไฟล์ที่อัปโหลดแล้วแยกวิเคราะห์พารามิเตอร์คำขอในนั้น ดังนั้นโดยทั่วไปจึงถูกเลือกให้ใช้ Common-FilePilePload ซึ่งเป็นส่วนประกอบอัพโหลดไฟล์ของเครื่องมือ Open Apache Open แพ็คเกจ JAR ของส่วนประกอบการอัปโหลดแบบสามัญทั่วไปสามารถดาวน์โหลดได้บนเว็บไซต์อย่างเป็นทางการของ Apache Common-Fileupload ขึ้นอยู่กับแพ็คเกจ Common-IO ดังนั้นคุณต้องดาวน์โหลดแพ็คเกจนี้ด้วย
1. การอัปโหลดไฟล์
หน้าอัปโหลด JSP
ข้อควรระวังต่อไปนี้จำเป็นต้องอัปโหลดส่วนประกอบ
แบบฟอร์มแบบฟอร์ม: method =” โพสต์” Enctype =” multipart/form-data”
เป็นของโดเมน: อินพุต type =” file” name =” ไฟล์” size =” 50”
จุดสองจุดนี้ทำและแสดงดังนี้
< %@ page contentType = "text/html; charset = utf-8" language = "java" %> <html> <head> <title> การทดสอบอัพโหลด </title> </head> <body> <form action = "method =" post "post" post " type = "ส่ง" name = "subment" value = "ส่ง"> </form> </body> </html>
web.xml เส้นทางอัปโหลดการกำหนดค่า
เส้นทางการอัปโหลดยังสามารถเขียนได้โดยตรงในรหัส แต่การกำหนดค่าสะดวกสบายที่นี่เพื่อแก้ไข
<dexting-param> <sention> ตำแหน่งในการจัดเก็บไฟล์ที่อัปโหลด </คำอธิบาย> <param-name> ไฟล์ -upload </param-name> <param-value> e: // temp // </param-value> </context-param>
จัดการ JSP ที่อัปโหลด
<%@ page contentType = "text/html; charset = utf-8" language = "java"%> <%@ page import = "org.apache.commons.fileupload.fileitem, org.apache.commons.fileupload.disk.diskfileitemfilemfirative org.apache.commons.fileupload.servlet.servletFileUpload " %> < %@ หน้านำเข้า =" java.io.file " %> < %@ page import =" java.util.iterator " %> 1024; บริบท servletContext = pageContext.getServletContext (); String filePath = context.getInitParameter ("file-upload"); // รับเส้นทางการอัปโหลดในไฟล์การกำหนดค่าสตริง contentType = request.getContentType (); // {DiskFileItemFactory Factory = ใหม่ diskFileItemFactory (); // สร้างฮาร์ดดิสก์ที่ใช้ FileItemFactory.SetSizEthreshold (maxMemsize); // ตั้งค่า Cache Fartory.SetRepository (ไฟล์ใหม่ ("E: // TEMP //") ServletFileUpload (โรงงาน); // สร้างไฟล์อัปโหลดไฟล์อัปโหลด Setsizemax (maxfilesize); // ตั้งค่าขนาดสูงสุดของการอัปโหลดไฟล์, หน่วย btry {list fileitems = upload.parserequest (คำขอ); fileItems.iterator (); out.println ("<html>"); out.println ("<head>"); out.println ("<title> ไฟล์ jsp upload </title>") out.println ("</head>"); fi = (fileitem) i.next (); ถ้า (! fi.isformfield ()) // ถ้าเป็นประเภทไฟล์อัปโหลดเพราะแบบฟอร์มอาจผสมกับประเภทอินพุตอื่น ๆ {สตริง fieldName = fi.getFieldName (); isinmemory = fi.isinmemory (); // long sizeinbytes = fi.getSize (); // ส่งคืนขนาดไฟล์ // เริ่มเขียนไปยังไฟล์ชื่อไฟล์เป็นแบบปรับแต่งได้ถ้า (filename.AlastIndexof ("//")> = 0) {ไฟล์ใหม่ ;} else {file = ไฟล์ใหม่ (filepath, filename.substring (filename.lastindexof ("//") +1));} fi.write (ไฟล์); out.println ("ชื่อไฟล์อัพโหลด:" "<br>");}} out.println ("</body>"); out.println ("</html>");} catch (exception ex) {system.out.println (ex);}}} {out.println ("<html>"); อัปโหลด </title> "); out.println (" </head> "); out.println (" <body> "); out.println (" <p> ไม่มีไฟล์อัปโหลด </p> "); out.println (" </body> ");2. ดาวน์โหลดไฟล์
การดาวน์โหลดไฟล์อ้างอิงไปยังบล็อกของ Gushan Canglang ซึ่งเขียนอย่างละเอียดและใช้โดยตรง
แนวคิดพื้นฐานของการดาวน์โหลดคือ: Traverse First ทั้งหมดในไดเรกทอรีดาวน์โหลดจากนั้นแสดงบนหน้าเว็บไคลเอนต์จะขอดาวน์โหลดและเซิร์ฟเวอร์ตอบกลับการดาวน์โหลด
แสดงรายการไฟล์ทั้งหมดในไดเรกทอรีดาวน์โหลด:
คลาสสาธารณะ ListFileservlet ขยาย httpservlet {public void doget (httpservletrequest Request, httpservletResponse Response) พ่น servletexception, ioexception {// รับไดเรกทอรีสำหรับการอัปโหลดไฟล์ uploadfilepath = this.getservletContext () แผนที่ <สตริง, สตริง> filenamemap = ใหม่ hashmap <สตริง, สตริง> (); // traverse traverse ไฟล์และไดเรกทอรีทั้งหมดซ้ำ ๆ ในไดเรกทอรี filepath และจัดเก็บชื่อไฟล์ของไฟล์ในคอลเลกชันแผนที่ ListFile (ไฟล์ใหม่ (uploadFilePath) request.setAttribute ("filenameMap", filenamemap); request.getRequestDispatcher ("/listfile.jsp") ส่งต่อ (คำขอ, การตอบสนอง);}/*** @method: listfile* @description listfile (ไฟล์ไฟล์, แผนที่ <สตริง, สตริง> แผนที่) {// ถ้าไฟล์ไม่แสดงไฟล์ แต่เป็นไดเรกทอรีถ้า (! file.isfile ()) {// รายการไฟล์และไดเรกทอรีทั้งหมดในไฟล์ไดเรกทอรีนี้ [] = file.listfiles (); // ไฟล์ transTraverse ชื่อ. ไฟล์ที่อัปโหลดถูกเปลี่ยนชื่อในรูปแบบของชื่อ UUID_FILE ลบ UUID_PART ของชื่อไฟล์ file.getName (). indexof ("_") เพื่อดึงตำแหน่งของอักขระ "_" ในสตริง หากชื่อไฟล์คล้ายกับ: 9349249849-88343-8344_A_FAN_DAVI.AVI ดังนั้น file.getName (). substring (file.getName (). indexof ("_")+1) สามารถรับ A_FAN_DAVI.AVI file.getName (). substring (file.getName (). indexof ("_")+1); // file.getName () ได้รับชื่อเดิมของไฟล์ ชื่อนี้ไม่ซ้ำกันดังนั้นจึงสามารถใช้เป็นคีย์ได้ RealName เป็นชื่อที่ประมวลผล มันอาจจะซ้ำ map.put (file.getName (), realName);}} โมฆะสาธารณะ dopost (คำขอ httpservletrequest, การตอบสนอง httpservletResponse) โยน servletexception, ioexception {doget (คำขอ, การตอบสนอง);}}}}}}}}}ที่นี่ฉันพูดคุยสั้น ๆ เกี่ยวกับวิธี ListFile ใน ListFileservlet เมธอด ListFile ใช้ในการแสดงรายการไฟล์ทั้งหมดในไดเรกทอรี วิธี ListFile ใช้การเรียกซ้ำ ในการพัฒนาจริงเราจะสร้างตารางในฐานข้อมูลอย่างแน่นอนซึ่งจะจัดเก็บชื่อไฟล์ที่อัปโหลดและไดเรกทอรีที่เก็บข้อมูลเฉพาะของไฟล์ เราสามารถรู้ไดเรกทอรีที่เก็บข้อมูลเฉพาะของไฟล์โดยการสอบถามตารางและไม่จำเป็นต้องใช้การดำเนินการซ้ำ ตัวอย่างนี้เป็นเพราะฐานข้อมูลไม่ได้จัดเก็บชื่อไฟล์ที่อัปโหลดและตำแหน่งที่เก็บข้อมูลเฉพาะของไฟล์และตำแหน่งที่เก็บข้อมูลของไฟล์ที่อัปโหลดจะใช้เพื่อแยกพื้นที่เก็บข้อมูลดังนั้นจำเป็นต้องมีการเรียกซ้ำ ในระหว่างการเรียกซ้ำชื่อไฟล์ที่ได้รับจะถูกเก็บไว้ในคอลเลกชันแผนที่ที่ส่งผ่านจากภายนอกไปยังวิธี ListFile ดังนั้นเราจึงสามารถมั่นใจได้ว่าไฟล์ทั้งหมดจะถูกเก็บไว้ในคอลเลกชันแผนที่เดียวกัน
กำหนดค่า listfileservlet ในไฟล์ web.xml
<servlet> <servlet-name> listfileservlet </servlet-name> <servlet-lass> me.gacl.web.controller.listfileservlet </servlet-lass> </servlet> <servlet-mapping>
หน้า listfile.jsp ที่แสดงไฟล์ที่ดาวน์โหลดมีดังนี้:
<%@ page language = "java" import = "java.util.*" pageencoding = "utf-8"%> <%@ taglib prefix = "c" uri = "http://java.sun.com/jsp/jstl/core"%> <! หน้า </title> </head> <body> <!-คอลเลกชันแผนที่ Traverse-> <c: foreach var = "me" items = "$ {filenamemap}"> <c: url value = "/servlet/downloadservlet" var = "downurl"> <c: param = "filename" value = "$ {me.key}"> </c: param> </c: url> $ {me.value} <a href = "$ {downurl}"> ดาวน์โหลด </a> <br/> </c: foreach> </body> </html>ใช้ไฟล์ดาวน์โหลด
แพ็คเกจ me.gacl.web.controller; นำเข้า java.io.file; นำเข้า java.io.fileinputstream; นำเข้า java.io.ioexception; นำเข้า java.io.OutputStream; นำเข้า java.net.urlencoder; javax.servlet.http.httpservletrequest; นำเข้า Javax.servlet.http.httpservletResponse; การดาวน์โหลดระดับสาธารณะ filename = request.getParameter ("ชื่อไฟล์"); //23239283-92489-avatar.avifilename = สตริงใหม่ (ชื่อไฟล์. getBytes ("iso8859-1"), "UTF-8"); // ไฟล์ที่อัปโหลดจะถูกบันทึกไว้ในไดเรกทอรีย่อย/web-inf/อัปโหลด filesaverootpath = this.getServletContext (). getRealPath ("/web-inf/upload"); // ค้นหาไดเรกทอรีที่ไฟล์อยู่โดยชื่อไฟล์สตริงชื่อไฟล์ = findFilesavePathByFiLEname (ชื่อไฟล์, ไฟล์ filenootpath); // if (! file.exists ()) {request.setAttribute ("ข้อความ", "ทรัพยากรที่คุณต้องการดาวน์โหลดถูกลบ !!"); request.getRequestDispatcher ("/message.jsp") ส่งต่อ (การตอบสนอง); return;} // การประมวลผล เบราว์เซอร์เพื่อดาวน์โหลดไฟล์ตอบกลับ setheader ("เนื้อหา-การจัดวาง", "ไฟล์แนบ; filename =" + urlencoder.encode (realname, "UTF-8")); // อ่านไฟล์ที่จะดาวน์โหลดและบันทึกไปยัง FileInputStream Response.getOutputStream (); // สร้างบัฟเฟอร์บัฟเฟอร์บัฟเฟอร์ [] = ไบต์ใหม่ [1024]; int len = 0; // loop อ่านเนื้อหาของสตรีมอินพุตลงในบัฟเฟอร์ในขณะที่ ((len = in.read (บัฟเฟอร์))> 0) in.close (); // ปิดสตรีมเอาท์พุท Out.close ();}/*** @Method: findFilesAvePathByFilename* @description: ค้นหาเส้นทางของไฟล์ที่จะดาวน์โหลดผ่านชื่อไฟล์และการจัดเก็บข้อมูลไดเร็กทอรี* @param filename ของไฟล์ที่จะดาวน์โหลด*/ สตริงสาธารณะ findfilesavePathByFileName (ชื่อไฟล์สตริง, สตริง saverootpath) {int hashCode = filename.hashCode (); int dir1 = hashCode & 0xf; // 0--15INT DIR2 = (HashCode & 0xf0) >> 4; // 0-15string dir = saverootpath + "//" + dir1 + "//" + dir2; // อัปโหลด/2/3 อัปโหลด/3/5file file = ไฟล์ใหม่ (dir); ถ้า (! file.exists ()) {// สร้าง directory file.mkdirs ();} return dir;} โมฆะสาธารณะ dopost (httpservletrequest คำขอการกำหนดค่า downloadservlet ในไฟล์ web.xml
<servlet> <servlet-name> downloadservlet </servlet-name> <servlet-lass> me.gacl.web.controller.downloadservlet </servlet-lass> </servlet> <servlet-mapping> <servlet-name> ดาวน์โหลด
ข้างต้นเป็นความรู้ที่เกี่ยวข้องเกี่ยวกับการอัปโหลดและดาวน์โหลดไฟล์ Javaweb ที่แนะนำโดยบรรณาธิการ ฉันหวังว่ามันจะเป็นประโยชน์กับคุณ