จำลองการอัพโหลดไฟล์เดียวได้ 2 วิธี มีผลดังนี้
ขั้นตอนการพัฒนามีดังนี้:
1. สร้างโครงการเว็บใหม่และนำเข้า jars ที่จำเป็นสำหรับไฟล์อัพโหลด struts2 ดังที่แสดงด้านล่าง
โครงสร้างไดเร็กทอรี
2. สร้างแอคชั่นใหม่
วิธีแรก
คัดลอกรหัสรหัสดังต่อไปนี้:
แพ็คเกจ com.ljq.action;
นำเข้า java.io.File;
นำเข้า org.apache.commons.io.FileUtils;
นำเข้า org.apache.struts2.ServletActionContext;
นำเข้า com.opensymphony.xwork2.ActionContext;
นำเข้า com.opensymphony.xwork2.ActionSupport;
@SuppressWarnings("อนุกรม")
UploadAction คลาสสาธารณะขยาย ActionSupport {
ไฟล์รูปภาพส่วนตัว // ไฟล์ที่อัปโหลด
imageFileName สตริงส่วนตัว; //ชื่อไฟล์
ส่วนตัว String imageContentType; // ประเภทไฟล์
สตริงสาธารณะดำเนินการ () พ่นข้อยกเว้น {
สตริง realpath = ServletActionContext.getServletContext().getRealPath("/images");
//D:/apache-tomcat-6.0.18/webapps/struts2_upload/รูปภาพ
System.out.println("realpath: "+realpath);
ถ้า (รูปภาพ != null) {
ไฟล์ savefile = ไฟล์ใหม่ (ไฟล์ใหม่ (realpath), imageFileName);
ถ้า (!savefile.getParentFile().exists())
savefile.getParentFile().mkdirs();
FileUtils.copyFile(รูปภาพ, บันทึกไฟล์);
ActionContext.getContext().put("ข้อความ", "อัพโหลดไฟล์สำเร็จ");
-
กลับ "ความสำเร็จ";
-
ไฟล์สาธารณะ getImage () {
กลับภาพ;
-
setImage โมฆะสาธารณะ (ภาพไฟล์) {
this.image = รูปภาพ;
-
สตริงสาธารณะ getImageFileName() {
กลับ imageFileName;
-
โมฆะสาธารณะ setImageFileName (String imageFileName) {
this.imageFileName = imageFileName;
-
สตริงสาธารณะ getImageContentType() {
กลับรูปภาพContentType;
-
โมฆะสาธารณะ setImageContentType (String imageContentType) {
this.imageContentType = imageContentType;
-
-
วิธีที่สอง
คัดลอกรหัสรหัสดังต่อไปนี้:
แพ็คเกจ com.ljq.action;
นำเข้า java.io.File;
นำเข้า java.io.FileInputStream;
นำเข้า java.io.FileOutputStream;
นำเข้า java.io.IOException;
นำเข้า org.apache.struts2.ServletActionContext;
นำเข้า com.opensymphony.xwork2.ActionSupport;
@SuppressWarnings("อนุกรม")
คลาสสาธารณะ UploadAction2 ขยาย ActionSupport {
//สรุปแอตทริบิวต์ของโดเมนไฟล์ที่อัปโหลด
ภาพไฟล์ส่วนตัว;
//สรุปแอตทริบิวต์ของประเภทไฟล์ที่อัพโหลด
imageContentType สตริงส่วนตัว;
//สรุปแอตทริบิวต์ของชื่อไฟล์ที่อัพโหลด
imageFileName สตริงส่วนตัว;
//ยอมรับคุณสมบัติการฉีดการพึ่งพา
สตริงส่วนตัว savePath;
@แทนที่
สตริงสาธารณะดำเนินการ () {
FileOutputStream fos = null;
FileInputStream fis = null;
พยายาม {
//สร้างไฟล์เอาท์พุตสตรีม
System.out.println(getSavePath());
fos = ใหม่ FileOutputStream(getSavePath() + "//" + getImageFileName());
//สร้างกระแสการอัพโหลดไฟล์
fis = ใหม่ FileInputStream(getImage());
ไบต์ [] บัฟเฟอร์ = ไบต์ใหม่ [1024];
อินท์เลน = 0;
ในขณะที่ ((len = fis.read (บัฟเฟอร์)) > 0) {
fos.write (บัฟเฟอร์, 0, เลน);
-
} จับ (ข้อยกเว้นจ) {
System.out.println("การอัพโหลดไฟล์ล้มเหลว");
e.printStackTrace();
} ในที่สุด {
ปิด(fos, fis);
-
คืนความสำเร็จ;
-
-
* กลับไปยังตำแหน่งบันทึกของไฟล์ที่อัพโหลด
-
* @กลับ
-
สตริงสาธารณะ getSavePath() พ่นข้อยกเว้น {
กลับ ServletActionContext.getServletContext().getRealPath(savePath);
-
โมฆะสาธารณะ setSavePath (สตริง savePath) {
this.savePath = บันทึกพาธ;
-
ไฟล์สาธารณะ getImage () {
กลับภาพ;
-
setImage โมฆะสาธารณะ (ภาพไฟล์) {
this.image = รูปภาพ;
-
สตริงสาธารณะ getImageContentType() {
กลับรูปภาพContentType;
-
โมฆะสาธารณะ setImageContentType (String imageContentType) {
this.imageContentType = imageContentType;
-
สตริงสาธารณะ getImageFileName() {
กลับ imageFileName;
-
โมฆะสาธารณะ setImageFileName (String imageFileName) {
this.imageFileName = imageFileName;
-
โมฆะส่วนตัวปิด (FileOutputStream fos, FileInputStream fis) {
ถ้า (fis != null) {
พยายาม {
fis.ปิด();
} จับ (IOException จ) {
System.out.println("FileInputStream ไม่สามารถปิดได้");
e.printStackTrace();
-
-
ถ้า (fos != null) {
พยายาม {
ฟอส.ปิด();
} จับ (IOException จ) {
System.out.println("FileOutputStream ไม่สามารถปิดได้");
e.printStackTrace();
-
-
-
-
ไฟล์คอนฟิกูเรชัน struts.xml
คัดลอกรหัสรหัสดังต่อไปนี้:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE สตรัท PUBLIC
"-//มูลนิธิซอฟต์แวร์ Apache//การกำหนดค่า DTD Struts 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<สตรัท>
<!-- แอ็ตทริบิวต์นี้ระบุส่วนต่อท้ายคำขอที่จำเป็นต้องประมวลผลโดย Struts2 ค่าดีฟอลต์ของแอ็ตทริบิวต์นี้คือ action นั่นคือ คำร้องขอทั้งหมดที่ตรงกับ *.action จะถูกประมวลผลโดย Struts2
หากผู้ใช้จำเป็นต้องระบุส่วนต่อท้ายคำขอหลายรายการ ให้คั่นส่วนต่อท้ายหลายรายการด้วยเครื่องหมายจุลภาค (,) -
<ชื่อคงที่ =ค่า "struts.action.extension" = "ทำ" />
<!-- ตั้งค่าว่าเบราว์เซอร์จะแคชเนื้อหาแบบคงที่หรือไม่ ค่าเริ่มต้นจะเป็นจริง (ใช้ในสภาพแวดล้อมการใช้งานจริง) ทางที่ดีควรปิดในระหว่างขั้นตอนการพัฒนา -->
<ชื่อคงที่ = "struts.serve.static.browserCache" ค่า = "false" />
<!-- เมื่อไฟล์คอนฟิกูเรชัน struts ได้รับการแก้ไข ไม่ว่าระบบจะโหลดไฟล์ซ้ำโดยอัตโนมัติหรือไม่ก็ตาม ค่าเริ่มต้นจะเป็นเท็จ (ใช้ในสภาพแวดล้อมการใช้งานจริง) วิธีที่ดีที่สุดคือเปิดใช้งานในระหว่างขั้นตอนการพัฒนา -->
<ชื่อคงที่ = "struts.configuration.xml.reload" value = "true" />
<!-- ใช้ในโหมดการพัฒนาเพื่อให้สามารถพิมพ์ข้อความแสดงข้อผิดพลาดโดยละเอียดเพิ่มเติมได้ -->
<ชื่อคงที่ =ค่า "struts.devMode" = "true" />
<!--ธีมมุมมองเริ่มต้น-->
<ชื่อคงที่="struts.ui.theme" value="simple" />
<!--<ชื่อคงที่="struts.objectFactory" value="spring" />-->
<!--วิธีแก้ปัญหารหัสที่อ่านไม่ออก-->
<ชื่อคงที่="struts.i18n.encoding" value="UTF-8" />
<!-- ระบุจำนวนไบต์สูงสุดที่อนุญาตสำหรับไฟล์ที่อัพโหลด ค่าเริ่มต้นคือ 2097152(2M) -->
<ชื่อคงที่="struts.multipart.maxSize" value="10701096"/>
<!-- ตั้งค่าโฟลเดอร์ชั่วคราวสำหรับไฟล์ที่อัพโหลด javax.servlet.context.tempdir จะถูกใช้เป็นค่าเริ่มต้น -->
<ชื่อคงที่="struts.multipart.saveDir " value="d:/tmp" />
<ชื่อแพ็คเกจ = "อัพโหลด" เนมสเปซ = "/ อัพโหลด" ขยาย = "struts-default">
<action name="*_upload" method="{1}">
<result name="success">/WEB-INF/page/message.jsp</result>
</การกระทำ>
</แพ็คเกจ>
<ชื่อแพ็คเกจ = "อัพโหลด2" ขยาย = "struts-default">
<ชื่อการกระทำ = "upload2" method = "ดำเนินการ">
<!-- ตั้งค่าแอตทริบิวต์ของ savePath --> แบบไดนามิก
<param name="savePath">/images</param>
<result name="success">/WEB-INF/page/message.jsp</result>
<ชื่อผลลัพธ์="input">/upload/upload.jsp</result>
<interceptor-ref name="fileUpload">
<!-- การกรองไฟล์ -->
<param name="allowedTypes">image/bmp,image/png,image/gif,image/jpeg</param>
<!-- ขนาดไฟล์ เป็นไบต์ -->
<param name="maximumSize">1025956</param>
</ตัวดัก-อ้างอิง>
<!-- ต้องวาง interceptor เริ่มต้นไว้หลัง fileUpload มิฉะนั้นจะไม่ถูกต้อง -->
<interceptor-ref name="defaultStack" />
</การกระทำ>
</แพ็คเกจ>
</สตรัท>
อัพโหลดหน้าแบบฟอร์ม
คัดลอกรหัสรหัสดังต่อไปนี้:
<%@ ภาษาหน้า = "java" import = "java.util.*" pageEncoding = "UTF-8"%>
<%@taglib uri="/struts-tags" คำนำหน้า = "s" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<หัว>
<title>อัพโหลดไฟล์</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="หมดอายุ" content="0">
</หัว>
<ร่างกาย>
<!-- ${pageContext.request.contextPath}/upload/execute_upload.do -->
<!-- ${pageContext.request.contextPath}/upload2/upload2.do -->
<รูปแบบการกระทำ = "${pageContext.request.contextPath}/upload2/upload2.do"
enctype="multipart/form-data" method="post">
ไฟล์:<input type="file" name="image">
<ประเภทอินพุต = "ส่ง" ค่า = "อัปโหลด" />
</แบบฟอร์ม>
<br/>
<s:fielderror />
</ร่างกาย>
</html>
แสดงหน้าผลลัพธ์
คัดลอกรหัสรหัสดังต่อไปนี้:
<%@ ภาษาหน้า = "java" import = "java.util.*" pageEncoding = "UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<หัว>
<title>อัปโหลดสำเร็จ</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="หมดอายุ" content="0">
</หัว>
<ร่างกาย>
อัปโหลดสำเร็จ!
<br/><br/>
<!-- ${pageContext.request.contextPath} เส้นทางการปรับใช้ Tomcat
ตัวอย่างเช่น: D:/apache-tomcat-6.0.18/webapps/struts2_upload/ -->
<img src="${pageContext.request.contextPath}/<s:property value="'images/'+imageFileName"/>">
<s:ดีบัก></s:ดีบัก>
</ร่างกาย>
</html>