ตัวอย่างของบทความนี้อธิบายวิธีการใช้ฟังก์ชันอัพโหลดและดาวน์โหลดไฟล์ใน struts2 ใน java แบ่งปันกับทุกคนสำหรับการอ้างอิงของคุณ การวิเคราะห์เฉพาะมีดังนี้:
1.อัพโหลดไฟล์
อันแรกคือโค้ดของหน้า jsp
กำหนดแท็กการอัปโหลดในหน้า jsp
คัดลอกโค้ดโค้ดดังนี้:<tr>
<td align="right" bgcolor="#F5F8F9"><b>ไฟล์แนบ:</b></td>
<td bgcolor="#FFFFFF">
<input type="file" name="upload" />
</td>
<td bgcolor="#FFFFFF"></td>
</tr>
จากนั้นแอตทริบิวต์ที่เกี่ยวข้องที่กำหนดไว้ใน BaseAction จะถูกละเว้น (คุณสามารถกำหนดได้ใน Action ของคุณเอง เพียงแค่เปลี่ยนตัวแก้ไขการเข้าถึง)
คัดลอกรหัสรหัสดังนี้:/**
*คลาสฐานแอ็กชัน
-
BaseAction ระดับสาธารณะขยาย ActionSupport {
รายการที่ได้รับการป้องกัน <ไฟล์> อัปโหลด;
รายการที่ได้รับการป้องกัน <String> uploadContentType; // ประเภทไฟล์
รายการที่ได้รับการป้องกัน <String> uploadFileName; //ชื่อไฟล์
สตริงที่ได้รับการป้องกัน savePath; // บันทึกเส้นทาง
-
จากนั้นก็มีวิธีอัพโหลดใน Action โดยมีโค้ดดังนี้
คัดลอกรหัสรหัสดังนี้:/**
* 8. อัปโหลดไฟล์แนบ * @param อัปโหลด
-
โมฆะสาธารณะ uploadAccess (รายการ <ไฟล์> อัปโหลด) {
พยายาม {
ถ้า (null != อัปโหลด) {
สำหรับ (int i = 0; i < upload.size(); i++) {
เส้นทางสตริง = getSavePath() + ""+ getUploadFileName().get(i);
System.out.println (เส้นทาง);
item.setAccessory(getUploadFileName().get(i));
FileOutputStream fos = FileOutputStream ใหม่ (เส้นทาง);
FileInputStream fis = ใหม่ FileInputStream(getUpload().get(i));
ไบต์ [] บัฟเฟอร์ = ไบต์ใหม่ [1024];
อินท์เลน = 0;
ในขณะที่ ((len = fis.read (บัฟเฟอร์)) > 0) {
fos.write (บัฟเฟอร์, 0, เลน);
-
fis.ปิด();
ฟอส.ปิด();
-
-
} จับ (ข้อยกเว้นจ) {
logger.error("เกิดข้อผิดพลาดในการอัพโหลดไฟล์แนบ", e);
-
-
จากนั้นโค้ดคัดลอกของไฟล์ struts2.xml ของฉันจะเป็นดังนี้: <action name="itemRDAction_*" method="{1}">
<param name="savePath">e:upload</param>
<interceptor-ref name="defaultStack">
<ชื่อพารามิเตอร์ = "fileUpload.allowedTypes">
แอปพลิเคชัน/octet-stream,รูปภาพ/pjpeg,รูปภาพ/bmp,รูปภาพ/jpg,รูปภาพ/png,รูปภาพ/gif,รูปภาพ/jpeg,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document,application/vnd ms-excel
</พารามิเตอร์>
<param name="fileUpload.maximumSize">8000000</param>
</ตัวดัก-อ้างอิง>
<ชื่อผลลัพธ์="show_item_rd_upd"> /WEB-INF/jsp/page_item/updItem_rd.jsp</result>
<ชื่อผลลัพธ์="show_item_rd_list"> /WEB-INF/jsp/page_item/listItem_rd.jsp</result>
<ชื่อผลลัพธ์="show_item_rd_push"> /WEB-INF/jsp/page_item/pushItem_rd.jsp</result>
</การกระทำ>
savePath เป็นพาธในการบันทึก fileUpload.allowedTypes ใช้เพื่อจำกัดประเภทไฟล์อัพโหลด fileUpload.maximumSize ขนาดไฟล์จำกัด
2.ดาวน์โหลดไฟล์
ขั้นแรก ให้คัดลอกโค้ดลิงก์ดาวน์โหลดบนหน้าดังนี้: <tr>
<td align="right" bgcolor="#F5F8F9"><b>ไฟล์แนบ:</b></td>
<td bgcolor="#FFFFFF">
<div>${item.accessory}</div>
<c:if test="${!empty item.accessory}">
<div style="float: left;"><a style="color: black; text- decoration: none;" href="download.action?filename=${item.accessory}">ดาวน์โหลด</a>< /div>
</c:ถ้า>
</td>
<td bgcolor="#FFFFFF"></td>
</tr>
ถัดไปคือรหัสสำหรับ DownloadAction:
คัดลอกรหัสรหัสดังนี้:/**
* ดาวน์โหลดแอคชั่น
-
* @ผู้เขียน zhaoxz
-
-
@Controller("ดาวน์โหลดแอคชั่น")
@Scope("ต้นแบบ")
DownloadAction คลาสสาธารณะขยาย BaseAction {
-
-
-
serialVersionUID ยาวสุดท้ายแบบคงที่ส่วนตัว = -4278687717124480968L;
ตัวบันทึก Logger แบบคงที่ส่วนตัว = Logger.getLogger (DownloadAction.class);
ชื่อไฟล์สตริงส่วนตัว
inputStream ส่วนตัว inputStream;
สตริงส่วนตัว savePath;
mimeType สตริงส่วนตัว;
สาธารณะ InputStream getInputStream () {
พยายาม {
เส้นทางสตริง = getSavePath() + "//"+ สตริงใหม่(filename.getBytes("ISO8859-1"), "utf-8");
System.out.println (เส้นทาง);
mimeType = ServletActionContext.getServletContext().getMimeType(path)+ ";charset=UTF-8";
inputStream = FileInputStream ใหม่ (เส้นทาง);
ตัวแทนสตริง = request.getHeader ("USER-AGENT");
System.out.println (ตัวแทน);
ถ้า (null != ตัวแทน) {
ถ้า (-1 != agent.indexOf("Firefox")) {// Firefox
mimeType = mimeType.replace("UTF-8", "ISO8859-1");
} อื่น ๆ {// IE7+ Chrome
System.out.println("IE,Chrome");
ชื่อไฟล์ = สตริงใหม่ (filename.getBytes("ISO8859-1"),"utf-8");
ชื่อไฟล์ = java.net.URLEncoder.encode(ชื่อไฟล์, "UTF-8");
-
-
} จับ (ข้อยกเว้นจ) {
logger.error("เกิดข้อผิดพลาดในการดาวน์โหลดไฟล์ข้อมูล", e);
-
ถ้า (null == อินพุตสตรีม) {
System.out.println("ข้อผิดพลาด getResource");
-
ส่งคืนอินพุตสตรีม;
-
โมฆะสาธารณะ setInputStream (InputStream inputStream) {
this.inputStream = อินพุตสตรีม;
-
@แทนที่
สตริงสาธารณะดำเนินการ () พ่นข้อยกเว้น {
คืนความสำเร็จ;
-
/****************************** รับการตั้งค่า ***************** ******* **********/
สตริงสาธารณะ getSavePath() {
กลับ this.savePath;
-
โมฆะสาธารณะ setSavePath (สตริง savePath) {
this.savePath = บันทึกพาธ;
-
สตริงสาธารณะ getFilename() {
ชื่อไฟล์ส่งคืน;
-
setFilename เป็นโมฆะสาธารณะ (ชื่อไฟล์ String) {
this.filename = ชื่อไฟล์;
-
-
จากนั้นจะมีไฟล์ struts2.xml:
คัดลอกโค้ดดังนี้: <action name="download">
<param name="savePath">E:/upload</param>
<ประเภทผลลัพธ์="สตรีม">
<param name="contentType">${mimeType}</param>
<param name="contentDisposition">ไฟล์แนบ;filename="${filename}"</param>
<param name="inputName">inputStream</param>
</ผล>
</การกระทำ>
เมื่อดาวน์โหลด ให้ใส่ใจกับรูปแบบการเข้ารหัสและไม่น่าจะมีปัญหาใดๆ
ปัญหาที่พบระหว่างการอัพโหลด
1. เกิดข้อผิดพลาดขณะอัปโหลดไฟล์ขนาดใหญ่ วิธีแก้ไขที่ 1
ข้อผิดพลาดที่เกิดขึ้นมีดังนี้:
1. 2012-02-24 11:06:31,937 ข้อผิดพลาด (org.apache.struts2.dispatcher.Dispatcher:512) - ไม่พบการดำเนินการหรือผลลัพธ์
ไม่มีผลลัพธ์ที่กำหนดไว้สำหรับการดำเนินการ com.iman.portal.action.QuestionActionImpl และผลลัพธ์ problemsPage - action - file:/E:/myeclipse/workspaces/portal/WebRoot/WEB-INF/classes/struts2/struts-question.xml:51: 55
2. คำขอถูกปฏิเสธเนื่องจากขนาด (2973652) เกินขนาดสูงสุดที่กำหนดค่าไว้ (2097152)
ความหมายภาษาจีน: คำขอถูกปฏิเสธเนื่องจากขนาด (2973652) เกินขนาดสูงสุดที่กำหนดค่าไว้ (2097152)
เมื่อพิจารณาถึงประสบการณ์ของผู้ใช้ จำเป็นต้องสกัดกั้นข้อยกเว้นดังกล่าวเมื่ออัปโหลดไฟล์แนบ วิธีแก้ไขมีดังนี้:
1. ไฟล์ที่อัพโหลดจะถูกจัดเก็บไว้ในแคชก่อนระหว่างกระบวนการอัพโหลด เพื่อความปลอดภัย ให้เพิ่มพาธหน่วยเก็บข้อมูลชั่วคราวไปยังไฟล์ struts.properties ของโปรเจ็กต์ แม้ว่าพาธฟิสิคัลของเซิร์ฟเวอร์จะถูกตั้งค่าไว้ในโปรเจ็กต์ก็ตาม
คัดลอกโค้ดดังต่อไปนี้: struts.multipart.saveDir=/temp
2. เมื่อพิจารณาว่าขนาดของไฟล์ที่อัพโหลดอาจมีการแก้ไขในภายหลัง ไม่ว่าจะเป็นค่าเริ่มต้นหรือไม่ก็ตาม ให้เพิ่มการกำหนดค่าต่อไปนี้ให้กับไฟล์ struts.properties ของโปรเจ็กต์:
คัดลอกโค้ดดังนี้: <!-- ขนาดไฟล์อัพโหลดที่อนุญาตคือ 2M -->
<ชื่อคงที่="struts.multipart.maxSize" value="2097152"/>
3. การกำหนดค่า struts.xml
คัดลอกรหัสดังนี้: <!-- วิธีแก้ไขปัญหา -->
<ชื่อการกระทำ = "updateProblem" method = "updateProblem">
<interceptor-ref name="fileUpload"/>
<interceptor-ref name="defaultStack" />
<ชื่อผลลัพธ์ = "input" /page/question/page/problemPage.jsp </result>
</การกระทำ>
4. ขั้นตอนที่สำคัญและสำคัญที่สุด
ตัวสกัดกั้น fileUpload จะกำหนดประเภทและขนาดไฟล์หลังจากอัพโหลดไฟล์ไปยังเซิร์ฟเวอร์เท่านั้น หากเราไม่ทำอะไรเลยใน Action ข้อยกเว้นจะแสดงต่อหน้าผู้ใช้ ดังนั้นฉันจึงคิดหาวิธีที่จะตั้งค่าข้อมูลข้อยกเว้นเป็นข้อความแสดงข้อผิดพลาดระดับ Action นั่นคือ แทนที่เมธอด addActionError
คัดลอกโค้ดโค้ดดังนี้: @Override
โมฆะสาธารณะ addActionError (สตริง anErrorMessage) {
// ที่นี่เราต้องพิจารณาก่อนว่าเป็นข้อผิดพลาดที่เราต้องการแทนที่ก่อนประมวลผลหรือไม่
if (anErrorMessage.startsWith("คำขอถูกปฏิเสธเนื่องจากขนาดของมัน")) {
รูปแบบรูปแบบ = Pattern.compile("d+");
Matcher m = pattern.matcher (ข้อความแสดงข้อผิดพลาด);
// แมตช์ครั้งเดียว
ม.ค้นหา();
String s1 =m.group();//ขนาดไฟล์ที่อัพโหลด
//แมตช์อีกแล้ว.
ม.ค้นหา();
String s2 =m.group();//ขนาดจำกัด
ถ้า(!s1.equals("") && !s2.equals("")){
fileUploadErrorMessage="ขนาดของไฟล์ที่คุณอัพโหลด (" + Long.valueOf(s1)/1024 + "bytes) เกินขนาดที่อนุญาต (" + Long.valueOf(s2)/1024/1024 + "M)";
getRequest().setAttribute("fileUploadErrorMessage","ไฟล์มีขนาดใหญ่เกินไปและเกินขนาดที่อนุญาต ("+Long.valueOf(s2)/1024/1024+"M) การอัปโหลดล้มเหลว!");
//แทนที่ข้อมูล
super.addActionError(fileUploadErrorMessage);
-
} else {// มิฉะนั้น ให้จัดการตามวิธีการเดิม
super.addActionError (ข้อความแสดงข้อผิดพลาด);
-
-
ใช่ ใช้ <s:fielderror/> <s:fielderror/> บนหน้าที่ส่งคืนเพื่อรับเนื้อหาข้อผิดพลาดใน addActionError
เนื่องจากฉันไม่ต้องการที่จะแสดงสาเหตุของข้อผิดพลาดบนเพจ และต้องการแสดงกล่องพร้อมท์ ฉันจึงใส่ข้อมูลลงในออบเจ็กต์คำขอ
เมื่อโหลดเพจแล้ว การตรวจสอบ js ต่อไปนี้จะถูกเพิ่ม:
คัดลอกโค้ดโค้ดดังต่อไปนี้: // ตรวจสอบว่าไฟล์ถูกอัปโหลดสำเร็จหรือไม่
var message="${request.fileUploadErrorMessage}";
if(message!=null && ""!=trim(message) && message!="null"){
self.parent.diag.close();
การแจ้งเตือน(ข้อความ);
กลับ;
-
ต่อไปนี้เป็นข้อมูลอ้างอิงเพื่อทำความเข้าใจ Dongdong:
struts.multipart.maxSize ควบคุมขนาดสูงสุดของไฟล์ที่อัปโหลดโดยทั้งโปรเจ็กต์
แอ็ตทริบิวต์ maximumSize ของ struts.multipart.maxSize และ fileUpload interceptors มีการแบ่งส่วนการทำงานที่แตกต่างกัน ซึ่งสรุปได้ดังนี้:
1.struts.multipart.maxSize ควบคุมขนาดสูงสุดของไฟล์ที่อัพโหลดในโปรเจ็กต์ทั้งหมด
หากเกินขนาดนี้ จะมีการรายงานข้อผิดพลาดในพื้นหลังและโปรแกรมไม่สามารถจัดการไฟล์ขนาดใหญ่ดังกล่าวได้ จะมีพร้อมท์ต่อไปนี้ใน fielderror:
คำขอถูกปฏิเสธเนื่องจากขนาด (16272982) เกินขนาดสูงสุดที่กำหนดค่าไว้ (9000000)
2. แอ็ตทริบิวต์ maximumSize ของ fileUpload interceptor ต้องน้อยกว่าค่าของ struts.multipart.maxSize
ค่าเริ่มต้น struts.multipart.maxSize คือ 2M เมื่อ maximumSize มากกว่า 2M ค่าของ struts.multipart.maxSize จะต้องตั้งค่าให้มากกว่า maximumSize
3. เมื่อไฟล์ที่อัพโหลดมีขนาดใหญ่กว่า struts.multipart.maxSize ระบบจะรายงานข้อผิดพลาด เมื่อไฟล์ที่อัพโหลดอยู่ระหว่าง struts.multipart.maxSize และ maximumSize ระบบจะแจ้ง:
ไฟล์ใหญ่เกินไป: ไฟล์ "MSF concept.ppt" "upload__5133e516_129ce85285f__7ffa_00000005.tmp" 6007104
เมื่อไฟล์ที่อัพโหลดมีขนาดเล็กกว่า maximumSize การอัพโหลดจะสำเร็จ
คัดลอกโค้ดดังนี้: <action name="UploadFile">
<ชื่อผลลัพธ์="UploadFileResult">/pages/ShowOtherFiles.jsp</result>
<ชื่อผลลัพธ์="JGBsuccess">/pages/JGBdetail.jsp</result>
<interceptor-ref name="fileUpload">
<param name="savePath">/data</param>
<param name="maximumSize">52428800</param>
</ตัวดัก-อ้างอิง>
<interceptor-ref name="defaultStack"></interceptor-ref>
</การกระทำ>
เกิดข้อผิดพลาดขณะอัปโหลดไฟล์ขนาดใหญ่ วิธีแก้ไขที่ 2:
ปัญหา: เกิดข้อผิดพลาดขณะอัปโหลดไฟล์ขนาดใหญ่...
วิธีแก้ไข: แก้ไขพารามิเตอร์ในไฟล์ struts.xml ดังต่อไปนี้: <constant name="struts.multipart.maxSize" value="55000000"/>
<ชื่อการกระทำ = "อัปโหลดไฟล์">
<ชื่อผลลัพธ์="UploadFileResult">/www.VeVB.COm/ ShowOtherFiles.jsp</result>
<ชื่อผลลัพธ์="JGBsuccess">/pages/JGBdetail.jsp</result>
<interceptor-ref name="fileUpload">
<param name="savePath">/data</param>
<param name="maximumSize">52428800</param>
</ตัวดัก-อ้างอิง>
<interceptor-ref name="defaultStack"></interceptor-ref>
</การกระทำ>
ความสัมพันธ์ระหว่างขนาดในไฟล์ struts.xml และขนาดไฟล์จริง: 1048576 (ไบต์) = 1024*1024 = 1M ขนาดไฟล์จริง
struts.multipart.maxSize ควบคุมขนาดสูงสุดของไฟล์ที่อัปโหลดโดยทั้งโปรเจ็กต์
แอ็ตทริบิวต์ maximumSize ของ struts.multipart.maxSize และ fileUpload interceptors มีการแบ่งส่วนการทำงานที่แตกต่างกัน ซึ่งสรุปได้ดังนี้:
1.struts.multipart.maxSize ควบคุมขนาดสูงสุดของไฟล์ที่อัพโหลดในโปรเจ็กต์ทั้งหมด หากเกินขนาดนี้ จะมีการรายงานข้อผิดพลาดในพื้นหลังและโปรแกรมไม่สามารถจัดการไฟล์ขนาดใหญ่ดังกล่าวได้ จะมีพร้อมท์ต่อไปนี้ใน fielderror:
คำขอถูกปฏิเสธเนื่องจากขนาด (16272982) เกินขนาดสูงสุดที่กำหนดค่าไว้ (9000000)
2. แอ็ตทริบิวต์ maximumSize ของ fileUpload interceptor ต้องน้อยกว่าค่าของ struts.multipart.maxSize
ค่าเริ่มต้น struts.multipart.maxSize คือ 2M เมื่อ maximumSize มากกว่า 2M ค่าของ struts.multipart.maxSize จะต้องตั้งค่าให้มากกว่า maximumSize
3. เมื่อไฟล์ที่อัพโหลดมีขนาดใหญ่กว่า struts.multipart.maxSize ระบบจะรายงานข้อผิดพลาด เมื่อไฟล์ที่อัพโหลดอยู่ระหว่าง struts.multipart.maxSize และ maximumSize ระบบจะแจ้ง:
ไฟล์ใหญ่เกินไป: ไฟล์ "MSF concept.ppt" "upload__5133e516_129ce85285f__7ffa_00000005.tmp" 6007104
เมื่อไฟล์ที่อัพโหลดมีขนาดเล็กกว่า maximumSize การอัพโหลดจะสำเร็จ
ข้อจำกัดประเภทไฟล์อัปโหลด
กำหนดค่าตัวสกัดกั้นการอัปโหลดไฟล์
defaultStack ของ struts2 มี fileupload interceptor อยู่แล้ว หากคุณต้องการเพิ่มพารามิเตอร์ AllowTypes คุณจะต้องเขียน defaultstack ใหม่ คัดลอกและแก้ไข:
คัดลอกโค้ดดังนี้: <interceptors>
<interceptor-stack name="myDefaultStack">
<interceptor-ref name="ข้อยกเว้น"/>
<interceptor-ref name="alias"/>
<interceptor-ref name="servletConfig"/>
<ชื่ออินเตอร์เซพเตอร์-ref="i18n"/>
<ชื่อผู้อ้างอิง-อ้างอิง=www.VeVB.COm/>
<interceptor-ref name="chain"/>
<interceptor-ref name="debugging"/>
<interceptor-ref name="การทำโปรไฟล์"/>
<interceptor-ref name="scopedModelDriven"/>
<interceptor-ref name="modelDriven"/>
<interceptor-ref name="fileUpload">
<ชื่อพารามิเตอร์ = "allowedTypes">
รูปภาพ/png,รูปภาพ/gif,รูปภาพ/jpeg
</พารามิเตอร์>
</ตัวดัก-อ้างอิง>
<interceptor-ref name="ช่องทำเครื่องหมาย"/>
<ชื่อ interceptor-ref="staticParams"/>
<interceptor-ref name="actionMappingParams"/>
<interceptor-ref name="params">
<param name="excludeParams">dojo..*,^สตรัท..*</param>
</ตัวดัก-อ้างอิง>
<interceptor-ref name="conversionError"/>
<interceptor-ref name="การตรวจสอบ">
<param name="excludeMethods">ป้อนข้อมูล ย้อนกลับ ยกเลิก เรียกดู</param>
</ตัวดัก-อ้างอิง>
<interceptor-ref name="เวิร์กโฟลว์">
<param name="excludeMethods">ป้อนข้อมูล ย้อนกลับ ยกเลิก เรียกดู</param>
</ตัวดัก-อ้างอิง>
</interceptor-กอง>
</ตัวดัก>
<default-interceptor-ref name="myDefaultStack"></default-interceptor-ref>
แก้ไขเฉพาะโค้ดที่คัดลอกในโค้ดดังต่อไปนี้: <interceptor-ref name="fileUpload">
<ชื่อพารามิเตอร์ = "allowedTypes">
รูปภาพ/png,รูปภาพ/gif,รูปภาพ/jpeg
</พารามิเตอร์>
</ตัวดัก-อ้างอิง>
Interceptor Stack ได้รับการกำหนดค่าภายในแท็ก <package> และภายนอกแท็ก <action> ตามที่กล่าวข้างต้น หากเรากำหนดให้เป็น Interceptor เริ่มต้น เราก็ไม่จำเป็นต้องทำเช่นนั้น
แนะนำไว้ในแท็ก <action> หากไม่เป็นเช่นนั้น คุณจะต้องแนะนำ interceptor โค้ดจะเป็นดังนี้: <action>
<ชื่อผลลัพธ์ = "input">/error/dbError.jsp</result>
<interceptor-ref name="myDefaultStack"></interceptor-ref>
</การกระทำ>
การดำเนินการข้อผิดพลาดประเภทการอัปโหลดไฟล์จะส่งคืนอินพุตโดยตรง ดังนั้นจึงไม่จำเป็นต้องส่งคืน "อินพุต" ในการดำเนินการ
คุณยังสามารถกำหนดเส้นทางและขนาดของคำขออัปโหลดของคุณภายนอกแท็ก <package>:
คัดลอกโค้ดดังต่อไปนี้: <constant name="struts.multipart.saveDir" value="/upload/detailed"></constant>
<ชื่อคงที่="struts.multipart.maxSize" value="1024"></constant>
จุดที่สำคัญที่สุด: ต้องเพิ่มแบบฟอร์มสำหรับการอัปโหลดไฟล์: enctype="multipart/form-data" หากไม่เป็นเช่นนั้น ระบบจะรายงานข้อผิดพลาดในการป้อนข้อมูล
ฉันหวังว่าบทความนี้จะเป็นประโยชน์กับการเขียนโปรแกรม Java ของทุกคน