依賴 JAR 包
- struts2-core
- commons-fileupload
- commons-io
- commons-logging
- freemarker (可選)
1. web.xml 配置過濾器
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
2. struts.xml 配置
<package name="default" extends="struts-default">
<action name="myupload" class="com.xmgc.sc.action.MyUpLoadAction">
<result name="success">/upload.jsp</result>
</action>
</package>
3. Action 類自動接收文件
public class MyUpLoadAction {
private String title; // 普通字段
private File upload; // 上傳文件(屬性名 = file 域 name)
private String uploadContentType; // 文件 MIME 類型
private String uploadFileName; // 原始文件名
// getter/setter 省略
public String execute() throws IOException {
String saveDir = ServletActionContext.getServletContext().getRealPath("/myupload");
File dest = new File(saveDir, uploadFileName);
FileUtils.copyFile(upload, dest); // commons-io 一行搞定
return SUCCESS;
}
}
命名約定(關鍵)
| 屬性 | 約定 | 示例 |
| 文件對象 | 屬性名 = file 域 name | upload → <input name="upload"> |
| ContentType | 屬性名 + ContentType | uploadContentType |
| 文件名 | 屬性名 + FileName | uploadFileName |
4. JSP 頁面
<form action="myupload.action" method="post" enctype="multipart/form-data">
文件名:<input type="text" name="title"/><br/>
上傳:<input type="file" name="upload"/><br/>
<input type="submit" value="上傳"/>
</form>
進階配置
<constant name="struts.multipart.maxSize" value="10485760" /> <!-- 10MB -->
<constant name="struts.multipart.parser" value="jakarta" /> <!-- 解析器 -->
多文件上傳
private List<File> uploads;
private List<String> uploadsContentType;
private List<String> uploadsFileName;
// JSP: 多個 <input type="file" name="uploads"/> 或同名多個
// Action 循環處理 List