เมื่อทำงานในระบบ B/S มักจะเกี่ยวข้องกับการอัปโหลดไฟล์และดาวน์โหลดไฟล์ ก่อนที่เราจะเชื่อมต่อกับเฟรมเวิร์ก Struts2 เราใช้องค์ประกอบ FilePload ของโครงการย่อยคอมมอนส์ภายใต้ Apache เพื่ออัปโหลดไฟล์ อย่างไรก็ตามหากเราทำเช่นนั้นรหัสจะดูยุ่งยากและไม่ยืดหยุ่น หลังจากเรียนรู้ struts2 struts2 ให้กลไกการใช้งานที่ดีกว่าสำหรับการอัปโหลดและดาวน์โหลดไฟล์ ที่นี่ฉันจะอธิบายซอร์สโค้ดสำหรับการอัปโหลดไฟล์เดียวและอัปโหลดหลายไฟล์ ที่นี่เราจำเป็นต้องนำเข้าไฟล์ Jar สองไฟล์ที่อัปโหลดโดยการดาวน์โหลดไฟล์หนึ่งคือ Commons-FilePiLoad-1.2.2.jar และอีกไฟล์คือ Commons-io-2.0.1.jar
struts2 การอัปโหลดไฟล์เดียว:
ก่อนอื่นมีหน้าอัปโหลดไฟล์ JSP นี่เป็นเรื่องง่ายมันเป็นแบบฟอร์มที่มีกล่องอัปโหลดไฟล์
<!-เมื่ออัปโหลดไฟล์วิธีการส่งแบบฟอร์มจะต้องโพสต์เนื่องจากไฟล์ไบนารีอาจมีขนาดใหญ่มากเมื่ออัปโหลดไฟล์ นอกจากนี้ยังมีแอตทริบิวต์ Enctype แอตทริบิวต์นี้จะต้องเขียนเป็น multipart/form-data มิฉะนั้นมันจะถูกอัปโหลดไปยังเซิร์ฟเวอร์ในข้อความไบนารี-> <form action = "fileupload.action" method = "post" enctype = "multipart/form-data"> ชื่อผู้ใช้ "ไฟล์" </form>
ถัดไปคือส่วน FilePloadAction ของรหัส เนื่องจาก Struts2 มีกลไกการฝึกงานที่ดีสำหรับการอัปโหลดและดาวน์โหลดเราจึงต้องเขียนโค้ดที่ใช้งานน้อยมากเท่านั้น:
FilePloadAction ระดับสาธารณะขยายการกระทำ asctupport {ชื่อผู้ใช้สตริงส่วนตัว; // โปรดทราบว่าไฟล์ไม่ได้อ้างถึงไฟล์ที่อัปโหลดโดย JSP front-end แต่ไฟล์ที่อัปโหลดเพื่อจัดเก็บไว้ภายใต้ไฟล์ส่วนตัวของโฟลเดอร์ชั่วคราว // ชื่อของไฟล์ที่ส่งไฟล์สตริงส่วนตัว fileName; // ประเภท MIME ของไฟล์ที่ส่งสตริงส่วนตัว fileContentType; สตริงสาธารณะ getUserName () {ส่งคืนชื่อผู้ใช้; } โมฆะสาธารณะ setUserName (ชื่อผู้ใช้สตริง) {this.userName = ชื่อผู้ใช้; } ไฟล์สาธารณะ getFile () {return file; } โมฆะสาธารณะ setFile (ไฟล์ไฟล์) {this.file = ไฟล์; } สตริงสาธารณะ getFileFileName () {return fileFileName; } โมฆะสาธารณะ setFileFileName (String fileFileName) {this.fileFileName = fileFileName; } สตริงสาธารณะ getFileContentType () {return fileContentType; } โมฆะสาธารณะ setFileContentType (สตริง fileContentType) {this.fileContentType = fileContentType; } @Override สตริงสาธารณะ execute () พ่นข้อยกเว้น {string root = servletactionContext.getServletContext (). getRealPath ("/อัปโหลด"); inputStream คือ = ใหม่ FileInputStream (ไฟล์); OutputStream OS = ใหม่ fileOutputStream (ไฟล์ใหม่ (root, fileFileName)); System.out.println ("filefilename:" + filefilename); // เนื่องจากไฟล์เป็นไฟล์ที่เก็บไว้ในโฟลเดอร์ชั่วคราวเราสามารถพิมพ์ชื่อไฟล์และพา ธ ไฟล์เพื่อดูว่ามันเหมือนกับไฟล์ fileFilename ก่อนหน้านี้. System.out.println ("ไฟล์:" + file.getPath ()); ไบต์ [] บัฟเฟอร์ = ไบต์ใหม่ [500]; ความยาว int = 0; ในขณะที่ (-1! = (length = is.read (บัฟเฟอร์, 0, buffer.length))) {os.write (บัฟเฟอร์); } os.close (); is.close (); กลับมาประสบความสำเร็จ -ก่อนอื่นเราต้องชัดเจนว่าไฟล์ที่นี่ไม่ได้อ้างถึงไฟล์ที่อัปโหลดโดย JSP เมื่ออัปโหลดไฟล์ Struts2 จะค้นหาตำแหน่งที่เก็บข้อมูลที่ระบุโดย struts.multipart.savedir (นี่คือค่าเริ่มต้น properties) เราสามารถสร้างไฟล์คุณสมบัติ struts.properties ใหม่เพื่อระบุตำแหน่งที่เก็บไฟล์ชั่วคราว หากไม่ได้ระบุไว้ไฟล์จะถูกเก็บไว้ใน Apache-Tomcat-7.0.29 ของ Tomcat/Work/Catalina/Localhost/Directory จากนั้นเราสามารถระบุตำแหน่งที่เก็บข้อมูลหลังจากอัปโหลดไฟล์และเพียงแค่เขียนลงในสตรีมผ่านสตรีมเอาต์พุต ในเวลานี้เราสามารถเห็นไฟล์ที่เราอัปโหลดในโฟลเดอร์
หลังจากอัปโหลดไฟล์เรายังต้องดาวน์โหลด อันที่จริงหลักการของการดาวน์โหลด Struts2 นั้นง่ายมาก มันคือการกำหนดสตรีมอินพุตแล้วเขียนไฟล์ลงในสตรีมอินพุต การกำหนดค่าคีย์ยังคงกำหนดค่าในไฟล์การกำหนดค่า struts.xml:
รหัส FileDownloadAction มีดังนี้:
Public Class PeledownloadAction ขยาย ActionsUpport {Public InputStream GetDownloadFile () {return servletActionContext.getServletContext (). getResourceasstream ("อัปโหลด/สมุดที่อยู่ 4 กันยายน 2012.xls"); } @Override สตริงสาธารณะ Execute () โยนข้อยกเว้น {คืนความสำเร็จ; -มาดูกันว่าการกระทำนี้เพียงแค่กำหนดสตรีมอินพุตแล้วให้วิธีการ getter ถัดไปลองดูที่ไฟล์กำหนดค่าของ struts.xml:
<action name = "filedOwnload"> <name result = "success" type = "stream"> <param name = "contentDisposition"> ไฟล์แนบ; filename = "สมุดที่อยู่ 4 กันยายน 2012.xls" </param> <param name = "inputName"> ดาวน์โหลด
มีหลายสิ่งที่เราต้องใส่ใจในไฟล์การกำหนดค่า struts.xml ก่อนอื่นประเภทของผลลัพธ์ ในอดีตเราได้กำหนดการกระทำ โดยทั่วไปเราไม่ได้เขียนแอตทริบิวต์ประเภทในผลลัพธ์เนื่องจากค่าเริ่มต้นที่จะขอการส่งต่อ (dispatcher) นอกเหนือจากแอตทริบิวต์นี้โดยทั่วไปมีค่าเช่นการเปลี่ยนเส้นทาง (เปลี่ยนเส้นทาง) ที่นี่เนื่องจากเรากำลังใช้การดาวน์โหลดไฟล์ประเภทจะต้องถูกกำหนดเป็นประเภทสตรีมบอกการกระทำ นี่คือผลลัพธ์ของการดาวน์โหลดไฟล์ โดยทั่วไปมีองค์ประกอบย่อยพารามิเตอร์ในองค์ประกอบผลลัพธ์ สิ่งนี้ใช้เพื่อตั้งค่าพารามิเตอร์เมื่อดาวน์โหลดไฟล์ e คุณสมบัตินี้คือการใช้สตรีมอินพุตไฟล์ในการดำเนินการ ชื่อจะต้องเหมือนกับแอตทริบิวต์อินพุตสตรีมในการดำเนินการ จากนั้นแอตทริบิวต์ ContentDisposition คือแอตทริบิวต์ ContentDisposition โดยทั่วไปคุณสมบัตินี้ใช้เพื่อระบุวิธีที่เราต้องการประมวลผลไฟล์ที่ดาวน์โหลด หากค่าเป็นไฟล์แนบกล่องดาวน์โหลดจะปรากฏขึ้นเพื่อให้ผู้ใช้สามารถเลือกได้ว่าจะดาวน์โหลดหรือไม่ หากไม่ได้ตั้งค่านี้เบราว์เซอร์จะตรวจสอบก่อนว่าจะเปิดไฟล์ที่ดาวน์โหลดมาก่อนหรือไม่ ถ้าทำได้มันจะเปิดไฟล์ที่ดาวน์โหลดโดยตรง (แน่นอนนี่ไม่ใช่สิ่งที่เราต้องการ) ค่าอื่นคือชื่อไฟล์ซึ่งเป็นชื่อดาวน์โหลดไฟล์ที่ได้รับแจ้งจากไฟล์เมื่อดาวน์โหลด หลังจากกำหนดค่าข้อมูลนี้เราสามารถใช้ฟังก์ชั่นดาวน์โหลดไฟล์
struts2 หลายไฟล์อัปโหลด :
ในความเป็นจริงหลักการของการอัปโหลดแบบหลายไฟล์นั้นเหมือนกับการอัปโหลดไฟล์เดียว การอัปโหลดไฟล์เดียวเป็นไฟล์เดียวและอาร์เรย์รายการ <file> รายการหรือไฟล์ [] อาร์เรย์จะถูกอัปโหลด ก่อนอื่นมาดูรหัสของส่วน JSP front-end ที่นี่ฉันใช้ jQuery เพื่อใช้งานการเพิ่มไฟล์แบบไดนามิกและการลบแบบไดนามิกกล่องดาวน์โหลด:
<script type = "text/javaScript" src = "script/jQuery-1.8.1.js"> </script> <script type = "text/javascript"> $ (function () {$ ("#ปุ่ม") คลิก (ฟังก์ชัน () {var html = $ (" value = 'delete'> <br> "); $ ("#body div "). ผนวก (html) .append (ปุ่ม); button.click (function () {html.remove (); ปุ่ม remove ();})})}) </script> </head> enctype = "multipart/form-data"> ชื่อผู้ใช้: <input type = "text" name = "username"> <br> ไฟล์: <input type = "file" name = "file"> <input type = "button" value = "เพิ่ม" id = "ปุ่ม"> <br> ชื่อของไฟล์จะต้องตั้งชื่อไฟล์จากนั้นรหัสการดำเนินการสำหรับการอัปโหลดหลายไฟล์มีดังนี้:
FilePloadAction2 ระดับสาธารณะขยายการดำเนินการ {ชื่อผู้ใช้สตริงส่วนตัว; // ที่นี่เราใช้รายการเพื่อจัดเก็บไฟล์ที่อัปโหลด ไฟล์ยังหมายถึงไฟล์ชั่วคราวในโฟลเดอร์ชั่วคราวแทนที่จะเป็นไฟล์ส่วนตัวที่อัปโหลดจริงรายการ <file> ไฟล์; // รายการนี้จัดเก็บชื่อของไฟล์ที่สอดคล้องกับไฟล์ในรายการ <file> รายการส่วนตัว <String> fileFileName; รายการส่วนตัว <String> FileContentType; สตริงสาธารณะ getUserName () {ส่งคืนชื่อผู้ใช้; } โมฆะสาธารณะ setUserName (ชื่อผู้ใช้สตริง) {this.userName = ชื่อผู้ใช้; } รายการสาธารณะ <file> getFile () {return file; } โมฆะสาธารณะ setFile (รายการ <file> ไฟล์) {this.file = ไฟล์; } รายการสาธารณะ <String> getFileFileName () {return fileFileName; } โมฆะสาธารณะ setFileFileName (รายการ <String> fileFileName) {this.fileFileName = fileFileName; } รายการสาธารณะ <String> getFileContentType () {return fileContentType; } โมฆะสาธารณะ setFileContentType (รายการ <String> fileContentType) {this.fileContentType = fileContentType; } @Override สตริงสาธารณะ execute () พ่นข้อยกเว้น {string root = servletactionContext.getServletContext (). getRealPath ("/อัปโหลด"); สำหรับ (int i = 0; i <file.size (); i ++) {inputStream คือ = new FileInputStream (file.get (i)); OutputStream OS = ใหม่ fileOutputStream (ไฟล์ใหม่ (root, fileFileName.get (i))); ไบต์ [] บัฟเฟอร์ = ไบต์ใหม่ [500]; @suppresswarnings ("ไม่ได้ใช้") ความยาว int = 0; ในขณะที่ (-1! = (length = is.read (บัฟเฟอร์, 0, buffer.length))) {os.write (บัฟเฟอร์); } os.close (); is.close (); } คืนความสำเร็จ; -สิ่งนี้ยังเขียนลงในสตรีมเอาต์พุตเพื่อให้เราเห็นไฟล์ที่อัปโหลดหลายไฟล์ในโฟลเดอร์
การดาวน์โหลดไฟล์ถัดไปนั้นเหมือนกับไฟล์ดาวน์โหลดตอนนี้และเหมือนกันคือ struts.xml ดังนั้นฉันจะไม่ทำซ้ำที่นี่
สรุป: โดยทั่วไปกลไกการอัปโหลดและดาวน์โหลดไฟล์ที่จัดทำโดย Struts2 ทำให้รหัสของเราง่ายขึ้น เราสามารถใช้กลไกนี้ในโครงการในอนาคต นอกจากนี้เรายังสามารถใช้ส่วนประกอบ FileUpload เพื่ออัปโหลดไฟล์ ทั้งหมดนี้ถูกกำหนดโดยการตั้งค่าส่วนบุคคล!
มีเนื้อหามากมายเกี่ยวกับฟังก์ชั่นการอัปโหลดและดาวน์โหลดไฟล์ใน Javaweb ขอบคุณสำหรับการอ่านของคุณ