คำนำ
เมื่อพัฒนาเว็บแอปพลิเคชันเราต้องจัดเตรียมฟังก์ชั่นการอัปโหลดให้ผู้ใช้เช่นการอัปโหลดรูปภาพเป็นอวตาร ในการอัปโหลดไฟล์เราต้องตั้งค่าวิธีการของแบบฟอร์มเป็นโพสต์และ Enctype เป็น multipart/form-data เฉพาะในกรณีนี้เบราว์เซอร์จะส่งข้อมูลไบนารีของไฟล์ที่เลือกของผู้ใช้ไปยังเซิร์ฟเวอร์ บทความนี้จะให้ข้อมูลสรุปโดยละเอียดของฟังก์ชั่นการอัปโหลดในกรอบ Struts2 ฉันจะไม่พูดด้านล่างมากนักลองมาดูการแนะนำรายละเอียดด้วยกัน
การอัปโหลดไฟล์ struts2
Struts2 ไม่ได้ให้ตัวแยกวิเคราะห์คำขอของตัวเองนั่นคือ Struts2 จะไม่จัดการกับคำขอหลายส่วน/ฟอร์มข้อมูลด้วยตัวเอง จำเป็นต้องโทรไปที่เฟรมเวิร์กการอัปโหลดอื่น ๆ เพื่อแยกวิเคราะห์ข้อมูลคำขอไบนารี แต่ struts2 เพิ่มเติมจะห่อหุ้มตัวแยกวิเคราะห์การอัปโหลดเดิมเพิ่มเติมเพื่อให้การอัปโหลดไฟล์ง่ายขึ้น
ใน default.properties ไฟล์การกำหนดค่าของ struts2 คุณสามารถดูรหัสการกำหนดค่าเช่นนี้:
### parser เพื่อจัดการคำขอโพสต์ HTTP เข้ารหัสโดยใช้ MIME-type multipart/form-data# struts.multipart.parser = cos# struts.multipart.parser = pell# struts.multipart.parser = jakarta-streamstrutiPart. โดย defaulttruts.multipart.savedir = struts.multipart.maxsize = 2097152
รหัสด้านบนส่วนใหญ่จะใช้เพื่อกำหนดค่าตัวแยกวิเคราะห์การอัปโหลดเมื่ออัปโหลดไฟล์ใน struts2 การห่อหุ้มของ struts2 แยกความแตกต่างระหว่างส่วนประกอบการอัปโหลดไฟล์พื้นฐาน ตราบใดที่ตัวแก้ไขถูกใช้สำหรับการอัปโหลดไฟล์การกำหนดค่านี้นักพัฒนาสามารถสลับระหว่างเฟรมเวิร์กการอัปโหลดไฟล์ที่แตกต่างกันได้อย่างง่ายดาย
Struts2 ใช้จาการ์ตาอัพโหลดตัวแยกวิเคราะห์โดยค่าเริ่มต้นแน่นอนถ้าคุณไม่ชอบคุณสามารถเปลี่ยนเป็นอย่างอื่นได้ ต่อไปนี้เป็นฟังก์ชั่นการอัปโหลดไฟล์อย่างง่ายโดยใช้ Struts2 ผ่านรหัส
ใช้การกระทำของการอัปโหลดไฟล์
หน้าแผนกต้อนรับ:
<form action = "upload" method = "post" enctype = "multipart/form-data"> title: <input type = "text" name = "title"> <br> ไฟล์: <อินพุต type = "file" name = "upload"> <br>
คลาสแอ็คชั่น:
การอัพโหลดคลาสสาธารณะขยายการกระทำที่เป็น {ชื่อสตริงส่วนตัว; อัปโหลดไฟล์ส่วนตัว สตริงส่วนตัว uploadContentType; uploadfilename สตริงส่วนตัว; สตริงส่วนตัว SavePath; โมฆะสาธารณะ setSavePath (ค่าสตริง) {this.savepath = ค่า; } สตริงส่วนตัว getSavePath () {String realPath = servletActionContext.getServletContext (). getRealPath ("/web-inf/" + savepath); กลับมา RealPath; } โมฆะสาธารณะ SettItle (ค่าสตริง) {this.title = value; } สตริงสาธารณะ getTitle () {return title; } โมฆะสาธารณะ setupload (ค่าไฟล์) {this.upload = value; } ไฟล์สาธารณะ getUpload () {return upload; } โมฆะสาธารณะ setuploadContentType (ค่าสตริง) {this.uploadContentType = ค่า; } สตริงสาธารณะ getFileContentType () {return uploadContentType; } โมฆะสาธารณะ setuploadfilename (ค่าสตริง) {this.uploadFileName = value; } สตริงสาธารณะ getUploadFileName () {return uploadfilename; } @Override สตริงสาธารณะ execute () พ่นข้อยกเว้น {fileOutputStream fos = ใหม่ fileOutputStream (getSavePath () + "//" + getUploadFileName ()); FileInputStream FIS = ใหม่ FileInputStream (getUpload ()); ไบต์ [] บัฟเฟอร์ = ไบต์ใหม่ [1024]; int len = 0; ในขณะที่ ((len = fis.read (บัฟเฟอร์))> 0) {fos.write (บัฟเฟอร์, 0, len); } fis.close (); fos.close (); กลับมาประสบความสำเร็จ -struts.xml ไฟล์กำหนดค่า:
<package name = "upload" exters = "struts-default"> <action name = "upload"> <param name = "savepath">/upload </param> <result name = "success">/success.jsp </results> <result name = "input">/index.jsp </results> </action>
สำหรับคลาสแอ็คชั่นมีคุณสมบัติพิเศษสองประการ:
แอตทริบิวต์ทั้งสองนี้ใช้เพื่อห่อหุ้มชื่อไฟล์ของไฟล์ที่อัปโหลดและประเภทไฟล์ของไฟล์ที่อัปโหลด สำหรับ struts2 หากแบบฟอร์มมีฟิลด์ไฟล์ที่มีแอตทริบิวต์ชื่อ XXX การกระทำที่สอดคล้องกันจะต้องใช้แอตทริบิวต์สามตัวเพื่อห่อหุ้มข้อมูลของฟิลด์ไฟล์:
ผ่านกระบวนการพัฒนาข้างต้นเราจะเห็นว่ามันเป็นเรื่องง่ายที่จะอัปโหลดไฟล์ผ่าน Struts2 สิ่งที่เราต้องทำคือเชื่อมโยงโดเมนไฟล์เข้ากับคุณสมบัติของไฟล์ประเภทในการดำเนินการเพื่อให้เราสามารถเข้าถึงเนื้อหาไฟล์ของไฟล์ที่อัปโหลดได้อย่างง่ายดาย สำหรับวิธีการที่ Struts2 ใช้ตัวแยกวิเคราะห์แบบหลายส่วนมันมีความโปร่งใสอย่างสมบูรณ์ต่อนักพัฒนา
ใช้การกรองไฟล์ด้วยตนเอง
หลายครั้งที่เว็บแอปพลิเคชันไม่อนุญาตให้ผู้ใช้อัปโหลดได้อย่างอิสระ เราจำเป็นต้อง จำกัด ประเภทไฟล์และขนาดไฟล์ที่อัปโหลดโดยผู้ใช้ดังนั้นการกรองไฟล์จะต้องดำเนินการระหว่างการอัปโหลดไฟล์ ตอนนี้เราจะใช้การกรองไฟล์อัปโหลดด้วยตนเอง
กำหนดค่าพารามิเตอร์ใหม่ใน struts.xml เพื่อระบุประเภทการอัปโหลดที่รองรับ:
<param name = "levertypes"> image/png, image/gif, image/jpeg </param>
เพิ่มฟังก์ชั่นการตรวจสอบความถูกต้องในการดำเนินการ:
// ตรวจสอบ @OverridePublic Void Validate () {String FilterResult = FilterType (getallowTypes (). แยก (",")); if (filterResult! = null) {addFielderRor ("อัปโหลด", "ประเภทไฟล์ที่คุณต้องการอัปโหลดไม่ถูกต้อง!"); }} public String FilterType (String [] ประเภท) {String fileType = getFileContentType (); สำหรับ (ประเภทสตริง: ประเภท) {ถ้า (type.equals (fileType)) {return null; }} return error;} นี่เป็นเพียงการใช้การตัดสินประเภทจากนั้นใช้การตรวจสอบขนาดตามวิธี length() ของคลาสไฟล์ แต่มันลำบากมากเรามาพูดถึงคำพูดที่ง่ายกว่ากัน
Interceptor ใช้การกรองไฟล์
struts2 ให้การสกัดกั้นสำหรับการอัปโหลดไฟล์และการกรองไฟล์สามารถทำได้ง่ายขึ้นโดยการกำหนดค่าตัวดักจับ ไฟล์อัปโหลดไฟล์ใน struts2 เพื่อให้ตัวดักทำงานทำงานได้คุณจะต้องกำหนดค่าการอ้างอิง interceptor ในการกระทำ
เมื่อกำหนดค่า fileupload interceptor คุณสามารถระบุพารามิเตอร์สองตัวสำหรับมัน:
<!-กำหนดค่า fileupload interceptor-> <interceptor-ref name = "fileupload"> <param name = "อนุญาตให้ใช้"> image/png, image/gif, image/jpeg </param> <param name = "maximumsize"> 20000000 </param> /> <ชื่อผลลัพธ์ = "ความสำเร็จ">/success.jsp </result>
ด้วยวิธีนี้การปรับเปลี่ยนการกำหนดค่าสามารถทำได้ซึ่งง่ายกว่าการเขียนโค้ดชิ้นหนึ่ง
ข้อความแสดงข้อผิดพลาดการกำหนดค่า
สำหรับข้อผิดพลาดในการอัปโหลดระบบจะแจ้งข้อความแสดงข้อผิดพลาดภาษาอังกฤษโดยค่าเริ่มต้น อย่างไรก็ตามเพื่อให้ได้ข้อความพรอมต์ระหว่างประเทศจำเป็นต้องเพิ่มคำจำกัดความข้อความสำคัญสองข้อต่อไปนี้ลงในไฟล์การกำหนดค่าทรัพยากรระหว่างประเทศ:
struts.messages.error.content.type.not.allowed = ประเภทไฟล์อัปโหลดไม่ถูกต้องโปรดอัปโหลดอีกครั้งstruts.messages.error.file.too.large = ไฟล์ที่คุณอัปโหลดมีขนาดใหญ่เกินไปโปรดอัปโหลดอีกครั้งถัดไปคุณสามารถใช้ <S: Fielderror/> เพื่อส่งข้อความแสดงข้อผิดพลาด
การกำหนดค่าคงที่สำหรับการอัปโหลดไฟล์
ที่จุดเริ่มต้นของบทความเราพูดคุยเกี่ยวกับการกำหนดค่าใน default.properties ซึ่งมี struts.multipart.saveDir การกำหนดค่า ฟังก์ชั่นเฉพาะของรายการการกำหนดค่านี้คืออะไร?
ในระหว่างกระบวนการอัพโหลดไฟล์ struts2 จะต้องระบุโฟลเดอร์ชั่วคราวเพื่อจัดเก็บไฟล์ชั่วคราวที่สร้างขึ้นระหว่างกระบวนการอัปโหลด หากไม่ได้ระบุโฟลเดอร์ชั่วคราวระบบจะเริ่มต้นใช้ javax.servlet.context.tempdir ภายใต้การทำงาน/catalina/localhost/path ภายใต้เส้นทางการติดตั้ง Tomcat และ struts.multipart.savedir กำหนดค่าตำแหน่งที่เก็บข้อมูลของไฟล์ชั่วคราว ดังนั้นในระหว่างกระบวนการพัฒนาคุณต้องให้ความสนใจว่าไดเรกทอรีได้อ่านและเขียนสิทธิ์หรือไม่
นอกจากนี้ยังมี struts.multipart.maxSize การกำหนดค่าซึ่งแสดงถึงขนาดของไฟล์ที่อัปโหลด หากคุณสมบัติสูงสุดของการกำหนดค่านี้และคุณสมบัติสูงสุดของ Fileupload interceptor ถูกระบุในเวลาเดียวกันมันจะเปรียบเทียบกับคุณสมบัติสูงสุดของ struts.multipart.maxSize การกำหนดค่าแล้วเปรียบเทียบกับคุณสมบัติสูงสุดของการสกัดกั้นไฟล์ หากขนาดไฟล์เกินค่ากำหนดค่าสูงสุดของ struts.multipart.maxSize ข้อยกเว้นจะปรากฏขึ้นและผลลัพธ์จะไม่ถูกถ่ายโอนไปยังอินพุต ให้แน่ใจว่าได้ให้ความสนใจกับสิ่งนี้
สรุป
บทความนี้สรุปการอัพโหลดไฟล์ในรายละเอียด struts2 มีเนื้อหาจำนวนมากโดยทั่วไปเนื้อหาทั้งหมดในคู่มือ เพียงแค่ใช้เป็นคู่มือ
โอเคข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่าเนื้อหาของบทความนี้จะมีค่าอ้างอิงบางอย่างสำหรับการศึกษาหรือที่ทำงานของทุกคน หากคุณมีคำถามใด ๆ คุณสามารถฝากข้อความไว้เพื่อสื่อสาร ขอบคุณสำหรับการสนับสนุน Wulin.com