FileUploadInterceptor),無需 ActionFormFile 物件供 Action 處理屬性命名慣例 (以表單 name="upload" 為例):
| 用途 | Getter/Setter | 型別 |
|---|---|---|
| 暫存檔 | getUpload() / setUpload(File) | java.io.File |
| 原始檔名 | getUploadFileName() / setUploadFileName(String) | String |
| Content-Type | getUploadContentType() / setUploadContentType(String) | String |
public class UploadAction extends ActionSupport {
private File upload;
private String uploadFileName;
private String uploadContentType;
// Getter/Setter 略...
public String execute() throws Exception {
try (InputStream is = new FileInputStream(upload);
OutputStream os = new FileOutputStream("d:/upload/" + uploadFileName)) {
byte[] buffer = new byte[8192];
int len;
while ((len = is.read(buffer)) > 0) os.write(buffer, 0, len);
}
return SUCCESS;
}
}
enctype="multipart/form-data")<s:form action="upload" namespace="/test" enctype="multipart/form-data">
<s:file name="upload" label="選擇檔案" />
<s:submit value="上傳" />
</s:form>
<s:property value="uploadFileName" />
<s:property value="uploadContentType" />
<script>
function addFileInput() {
var input = document.createElement("input");
input.type = "file";
input.name = "upload"; // 同名稱
document.getElementById("fileList").appendChild(input);
document.getElementById("fileList").appendChild(document.createElement("br"));
}
</script>
<input type="button" value="新增檔案" onclick="addFileInput()" />
<form action="/struts2/test/upload.action" method="post" enctype="multipart/form-data">
<div id="fileList"><input type="file" name="upload" /><br/></div>
<input type="submit" value="上傳" />
</form>
注意:範例使用 document.createElement("input") 相容性較佳,原文 createElement("<input ...>") 僅 IE 支援。
public class UploadMoreAction extends ActionSupport {
private List<File> uploads;
private List<String> uploadsFileName;
private List<String> uploadsContentType;
// Getter/Setter 略...
public String execute() throws Exception {
if (uploads != null) {
for (int i = 0; i < uploads.size(); i++) {
File src = uploads.get(i);
String destName = uploadsFileName.get(i);
try (InputStream is = new FileInputStream(src);
OutputStream os = new FileOutputStream("d:/upload/" + destName)) {
byte[] buffer = new byte[8192];
int len;
while ((len = is.read(buffer)) > 0) os.write(buffer, 0, len);
}
}
}
return SUCCESS;
}
}
| 設定 | 預設值 | 調整方式 (struts.properties) |
|---|---|---|
| 暫存目錄 | javax.servlet.context.tempdir | struts.multipart.saveDir=/custom/temp |
| 最大檔案大小 | 2 MB (2,097,152 bytes) | struts.multipart.maxSize=2048 (單位 KB) → 2 MB |
struts.properties 放在 src/ 根目錄 (同層 struts.xml)。
server.xml Connector 設定 URIEncoding="UTF-8",且 JSP 頁面 pageEncoding="UTF-8"FileUploadInterceptor 會拋出錯誤,可在 validation.xml 或 Action validate() 攔截友善提示finally 或攔截器 cleanup 確保刪除| 特性 | Struts 1.x | Struts 2 |
|---|---|---|
| 上傳元件 | Form Bean + MultipartRequestHandler | FileUploadInterceptor (自動裝載) |
| 多檔處理 | 需索引屬性 file1, file2... | 同名 List<File> 自動綁定 |
| 配置複雜度 | 高 | 極低 |