ถัดจากบทความก่อนหน้า:
2. ไฟล์อัปโหลดและดาวน์โหลด
สามเทคนิคที่พัฒนาโดย struts2, page jsp - ไฟล์การกำหนดค่า struts2.xml - และการดำเนินการคลาสแอ็คชั่น
ไฟล์อัพโหลดสิ่งที่จำเป็นต้องมี:
วิธีการของแบบฟอร์มจะต้องโพสต์
Enctype ของแบบฟอร์มจะต้องเป็นแบบหลายส่วน/ฟอร์มข้อมูล
ระบุฟิลด์การอัปโหลดอินพุตของ Type = "File"
กฎบางอย่างสำหรับการสนับสนุน struts สำหรับการอัปโหลดไฟล์
1. การอัปโหลดไฟล์เดียว
ขั้นตอนการพัฒนา:
1) เพิ่ม Commons-Fileupload -1.2.1.jar และ Commons-io-1.3.2.jar ภายใต้ web-inf/lib ไฟล์สองไฟล์นี้สามารถดาวน์โหลดได้จาก http://commons.apache.org/
2) ขั้นตอนที่ 2: เขียน upfile.jsp และตั้งค่า Enctype ของตารางฟอร์มเป็น: "multipart/form-data" ดังต่อไปนี้:
<%@ page language = "java" import = "java.util.*" pageencoding = "utf-8"%> <%@ taglib uri = "/struts-tags" คำนำหน้า = "s"%> <body> action = "$ {pageContext.request.contextPath} /upload1.action" method = "post" enctype = "multipart/form-data"> <!-ผ่าน MIME-> ชื่อผู้ใช้: <อินพุตประเภท = "text" name = "ชื่อผู้ใช้"/> <br/> value = "upload"/> </form> </body>เขียนข้อผิดพลาดหน้าข้อผิดพลาด. jsp
<body> เซิร์ฟเวอร์ไม่ว่างลองอีกครั้งหลังจากนั้นไม่นาน </body>
success.jsp
<body> อัปโหลดสำเร็จ </body>
3) การเขียนอัปโหลดคลาส 1: เพิ่มแอตทริบิวต์ลงในคลาสการกระทำและแอตทริบิวต์ที่สอดคล้องกับชื่อของฟิลด์ไฟล์ในแบบฟอร์ม:
แพ็คเกจ com.itheima.actions; นำเข้า java.io.file; นำเข้า java.io.ioexception; นำเข้า org.apache.commons.io.fileutils; นำเข้า org.apache.struts2.servletactionContext; นำเข้า com.opensymphony.xwork2.ActionSupport รูปภาพไฟล์ส่วนตัว; // สอดคล้องกับชื่อฟิลด์อัปโหลดของแบบฟอร์ม ประเภทคือไฟล์ประเภทไฟล์ส่วนตัวสตริง photofileName; // อัปโหลดชื่อไฟล์ส่วนตัวสตริงส่วนตัว photocontentType; // อัปโหลดไฟล์ MIME ประเภท // omit getter และวิธีการตั้งค่าสตริงสาธารณะอัพโหลด () {system.out.println (photofileName+":"+PhotocontentType); // ฟิลด์สามัญ: System.out.println (ชื่อผู้ใช้); // ฟิลด์อัปโหลด: อัปโหลดไปยังโฟลเดอร์ บันทึกลงในสตริงของแอปพลิเคชัน images realpath = servletactionContext.getServletContext (). getRealPath ("/images"); ไดเรกทอรีไฟล์ = ไฟล์ใหม่ (RealPath); if (! directory.exists ()) {directory.mkdirs (); } ลอง {fileutils.copyfile (รูปภาพ, ไฟล์ใหม่ (ไดเรกทอรี, photofileName)); กลับมาประสบความสำเร็จ } catch (ioexception e) {e.printstacktrace (); เกิดข้อผิดพลาดคืน; -เพิ่มการกำหนดค่าต่อไปนี้ในไฟล์ struts.xml
<action name = "upload1" method = "upload"> <interceptor-ref name = "defaultStack"> <param name = "fileupload.allowedTypes"> image/jpeg, image/png </param> <result> /success.jsp </result> <name result = "ข้อผิดพลาด">/orror.jsp </result> <name result = "input">/index.jsp </result> </action>
การวิเคราะห์หลักการ:
. FileUpload Interceptor รับผิดชอบในการจัดการการดำเนินการอัปโหลดไฟล์ มันเป็นสมาชิกของ Stack Interceptor DefaultStack DefaultStack Interceptor มี 3 คุณสมบัติที่สามารถตั้งค่าได้
•สูงสุด: ความยาวสูงสุดของไฟล์ที่อัปโหลด (เป็นไบต์) ค่าเริ่มต้นคือ 2 MB
• FELDTYPES: ประเภทที่อนุญาตให้อัปโหลดไฟล์ซึ่งคั่นด้วยเครื่องหมายจุลภาค
•อนุญาตให้ใช้งาน: อนุญาตให้อัปโหลดส่วนขยายไฟล์ คุณสมบัติ 3 ประการเหล่านี้สามารถเขียนทับในไฟล์ struts.xml ได้โดยการแยกคอมมาแต่ละส่วนขยาย
ข. การอัปโหลดไฟล์ที่เกินขนาดหรือผิดกฎหมายจะทำให้เกิดข้อผิดพลาด (เปลี่ยนไปยังมุมมองอินพุต)
ผ่าน:
<s: ActionError/> <s: feilderror/> tip to display message
ค. เปลี่ยนพรอมต์ข้อความแสดงข้อผิดพลาดเป็นเวอร์ชันภาษาจีน: ด้วยความช่วยเหลือของไฟล์ทรัพยากรข้อความระหว่างประเทศ
หากข้อผิดพลาดเกิดจากการกำหนดค่าพารามิเตอร์เริ่มต้นทั่วโลกจะเป็นการดีที่สุดที่จะใช้ไฟล์ทรัพยากรข้อความทั่วโลก
ไฟล์ทรัพยากรพรอมต์เริ่มต้นสำหรับ struts2: struts-message.properties ไฟล์ของ struts2-core-**. jar เพียงเปรียบเทียบค่าคีย์เพื่อเขียนทับค่าที่สอดคล้องกัน
การกำหนดค่ามีดังนี้:
struts.messages.error.uploading = การอัปโหลดข้อผิดพลาด: {0}
struts.messages.error.file.too.large = ไฟล์ใหญ่เกินไป: {0} "{1}" "{2}" {3}
struts.messages.error.content.type.not.allowed = เนื้อหาประเภทไม่อนุญาต: {0} "{1}" "{2}" {3}
struts.messages.error.file.extension.not.allowed = ส่วนขยายไฟล์ไม่อนุญาต: {0} "{1}" "{2}" {3}
{0}: ค่าของแอตทริบิวต์ชื่อใน <อินพุต type = "file" name = "UploadImage">
{1}: ชื่อจริงของไฟล์ที่อัปโหลด
{2}: ชื่อของไฟล์อัปโหลดที่บันทึกไว้ในไดเรกทอรีชั่วคราว
{3}: ประเภทของไฟล์ที่อัปโหลด (สำหรับ struts.messages.error.file.too.large เป็นขนาดของไฟล์ที่อัปโหลด)
ซอร์สโค้ด:
แก้ไขข้อมูลของไฟล์ทรัพยากรที่แสดงข้อผิดพลาด
ขั้นตอนที่ 1: สร้างไฟล์ทรัพยากรใหม่เช่น fileUploadMessage.properties วางไว้ใต้ SRC เพื่อเพิ่มข้อมูลต่อไปนี้ลงในไฟล์ทรัพยากร
struts.messages.error.uploading = การอัปโหลดข้อผิดพลาด: {0}
struts.messages.error.file.too.large = อัปโหลดไฟล์มีขนาดใหญ่เกินไป: {0} "{1}" "{2}" {3}
struts.messages.error.content.type.not.allowed = ประเภทของไฟล์ที่อัปโหลดไม่อนุญาต: {0} "{1}" "{2}" {3}
struts.messages.error.file.extension.not.allowed = ชื่อต่อท้ายของไฟล์ที่อัปโหลดไม่อนุญาต: {0} "{1}" "{2}" {3}
ขั้นตอนที่ 2: โหลดไฟล์ทรัพยากรในไฟล์ struts.xml
<!-กำหนดค่าไฟล์ทรัพยากรสำหรับข้อมูลข้อผิดพลาดเกี่ยวกับการอัปโหลดไฟล์->
<constant name = "struts.custom.i18n.resources" value = "cn … .xxx.fileuploadMessage"/>
2. อัปโหลดหลายไฟล์
อัปโหลดหลายไฟล์คุณสามารถใช้อาร์เรย์หรือรายการและไฟล์อื่น ๆ คล้ายกับการอัปโหลดไฟล์เดียว
แพ็คเกจ com.itheima.actions; นำเข้า java.io.file; นำเข้า java.io.ioexception; นำเข้า org.apache.commons.io.fileutils; นำเข้า org.apache.struts2.servletactionContext; นำเข้า com.opensymphony.xwork2.ActionSupport ไฟล์ส่วนตัว [] photo; // สอดคล้องกับชื่อฟิลด์อัปโหลดของแบบฟอร์ม ประเภทคือไฟล์ type.array หรือรายการสตริงส่วนตัว [] photofileName; // อัปโหลดชื่อไฟล์สตริงส่วนตัว [] photocontentType; // อัปโหลดไฟล์ MIME ประเภทสตริงสาธารณะอัปโหลด () {// ฟิลด์อัปโหลด: อัปโหลดไปยังโฟลเดอร์ บันทึกลงในสตริงของแอปพลิเคชัน images realpath = servletactionContext.getServletContext (). getRealPath ("/images"); ไดเรกทอรีไฟล์ = ไฟล์ใหม่ (RealPath); if (! directory.exists ()) {directory.mkdirs (); } ลอง {สำหรับ (int i = 0; i <photo.length; i ++) {fileutils.copyfile (รูปภาพ [i], ไฟล์ใหม่ (ไดเรกทอรี, photofileName [i])); } คืนความสำเร็จ; } catch (ioexception e) {e.printstacktrace (); เกิดข้อผิดพลาดคืน; -3. ดาวน์โหลดไฟล์
หลักการ: struts2 จัดเตรียมประเภทผลลัพธ์สตรีมซึ่งเป็นประเภทผลลัพธ์สตรีมที่ระบุที่ใช้โดยเฉพาะเพื่อรองรับฟังก์ชั่นดาวน์โหลดไฟล์ มันต้องการพารามิเตอร์ inputName ที่จะระบุ พารามิเตอร์นี้ระบุสตรีมอินพุตและให้รายการไปยังไฟล์ที่ดาวน์โหลด
ขั้นตอนการเข้ารหัส:
1) การดาวน์โหลดคลาสแอ็คชั่น:
แพ็คเกจ com.itheima.actions; นำเข้า java.io.file; นำเข้า java.io.fileinputstream; นำเข้า java.io.filenotfoundException; นำเข้า java.io.inputstream; นำเข้า java.net.urlencoder com.opensymphony.xwork2.actionsupport; การดาวน์โหลดคลาสสาธารณะขยายการกระทำ actionsupport {ภาพอินพุตส่วนตัว; // ใช้ในชื่อไฟล์สตริงส่วนตัวที่มีปัญหา; // ชื่อไฟล์ Long Filesize; Public InputStream getImage () {return image; } โมฆะสาธารณะ setImage (อิมเมจอินพุต) {this.image = image; } สตริงสาธารณะ getFilename () {return filename; } public Long GetFilesize () {return filesize; } public String download () พ่นข้อยกเว้น {// กำหนดค่าให้กับ image byte stream string filerealpath = servletactioncontext.getservletContext (). getRealPath ("/web-inf/classes/如 .jpg"); filename = filenameutils.getName (filerealpath); // วิธีที่ 1: ไฟล์ภาษาจีนควรได้รับการเข้ารหัส URL // filename = urlencoder.encode (ชื่อไฟล์, "UTF-8"); filesize = ไฟล์ใหม่ (filerealpath) .length (); System.out.println (ชื่อไฟล์); image = new fileInputStream (filerealpath); กลับมาประสบความสำเร็จ -struts.xml ไฟล์กำหนดค่า: ส่วนใหญ่กำหนดค่าผลลัพธ์ของประเภทสตรีม
<struts> <constant name = "struts.devmode" value = "true" /> <constant name = "struts.ognl.allowstaticmethodaccess" value = "true" /> <action name = "ดาวน์โหลด" method = "ดาวน์โหลด"> <result type = "stream"> <param name = <param name = "contentType"> แอปพลิเคชัน/octet-stream </param> <!-บอกส่วนหัวการตอบกลับของเบราว์เซอร์รูปแบบ MIME ของไฟล์และเรียกใช้วิธีการ getContentType ในการดำเนินการ-> <!-ใช้การแสดงออกของ OGNL ใน struts.xml เรียก getFilename () ในคลาสการกระทำ-> <!-การเข้ารหัสชื่อไฟล์ภาษาจีน: วิธีการ 2. ใช้นิพจน์ OGNL เพื่อเรียกวิธีการคงที่ของ urlencode-> <! คุณต้องเปิดสวิตช์คงที่ struts.ognl.allowstaticmethodaccess = true-> <param name = "contentDisposition"> ไฟล์แนบ; filename = $ {@@java.net.urlencoder@encode (ชื่อ filenamed "utf-8 ')} </param> <! </result> </action> </package> </struts> Interceptor และไฟล์อัปโหลดสิ้นสุดที่นี่ มันเหนื่อยมาก แต่เต็มไปด้วยความสำเร็จ
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น