Struts 2 基於 Commons FileUpload 實現文件上傳,核心在於 <s:file> 標簽與 Action 屬性約定式綁定。本文以 Struts 2.0.6 為基線,覆蓋 JSP 頁面、Action 處理、攔截器配置、錯誤處理、多文件上傳全流程。
| Action 屬性 | 含義 |
|---|---|
myFile (File) | 上傳文件臨時存儲路徑 |
myFileContentType (String) | MIME 類型(如 image/jpeg) |
myFileFileName (String) | 原始文件名(不含路徑) |
<s:form action="fileUpload" method="POST" enctype="multipart/form-data">
<s:file name="myFile" label="Image File"/>
<s:textfield name="caption" label="Caption"/>
<s:submit/>
</s:form>
public class FileUploadAction extends ActionSupport {
private File myFile;
private String myFileContentType;
private String myFileFileName;
private String caption;
// Setter 省略...
public String execute() {
String ext = myFileFileName.substring(myFileFileName.lastIndexOf('.'));
String newName = System.currentTimeMillis() + ext;
File dest = new File(ServletActionContext.getServletContext().getRealPath("/UploadImages"), newName);
copy(myFile, dest); // 緩衝流拷貝
this.imageFileName = newName; // 供結果頁顯示
return SUCCESS;
}
}
<action name="fileUpload" class="tutorial.FileUploadAction">
<interceptor-ref name="fileUploadStack"/>
<result name="success">/ShowUpload.jsp</result>
</action>
替換 fileUploadStack 為細粒度 fileUpload 攔截器 + defaultStack:
<interceptor-ref name="fileUpload">
<param name="allowedTypes">image/bmp,image/png,image/gif,image/jpeg</param>
<param name="maximumSize">2097152</param> <!-- 2MB -->
</interceptor-ref>
<interceptor-ref name="defaultStack"/>
<result name="input">/FileUpload.jsp</result> <!-- 驗證失敗返回 -->
JSP 添加 <s:fielderror/> 顯示錯誤。國際化覆蓋 struts.messages.error.content.type.not.allowed、struts.messages.error.file.too.large 等鍵值實現自定義提示。
<s:file name="upload" label="File (1)"/>
<s:file name="upload" label="File (2)"/>
<s:file name="upload" label="File (3)"/>
private File[] uploads;
private String[] uploadFileNames;
private String[] uploadContentTypes;
// 對應 Setter...
private List<File> uploads = new ArrayList<>();
private List<String> uploadFileNames = new ArrayList<>();
private List<String> uploadContentTypes = new ArrayList<>();
// 對應 Setter...
Struts 2 自動按順序注入,索引一一對應。
控制台提示 struts.multipart.saveDir 未設置,默認用 Servlet 容器臨時目錄。在 struts.properties 指定:
struts.multipart.saveDir=/tmp
目錄不存在會自動創建。