Struts 透過 <html:file> 標籤與 FormFile 介面,將檔案上傳封裝為標準 ActionForm 屬性處理流程。本文六步驟完成單檔上傳功能,含儲存路徑配置與大小限制。
<%@ taglib uri="https://struts.apache.org/tags-html" prefix="html" %>
<html:form enctype="multipart/form-data" action="uploadFile">
<html:file property="myFile" /><br>
<html:submit value="上傳" />
</html:form>
關鍵:enctype="multipart/form-data" 必須設定,否則瀏覽器不會送出檔案內容。
package actionform;
import org.apache.struts.action.ActionForm;
import org.apache.struts.upload.FormFile;
public class UploadForm extends ActionForm {
private FormFile myFile;
public FormFile getMyFile() { return myFile; }
public void setMyFile(FormFile myFile) { this.myFile = myFile; }
}
package action;
import actionform.UploadForm;
import org.apache.struts.upload.FormFile;
import java.io.*;
public class UploadAction extends Action {
protected void saveFile(FormFile formFile) throws Exception {
String path = getServlet().getServletConfig().getInitParameter("uploadPath");
InputStream in = formFile.getInputStream();
FileOutputStream out = new FileOutputStream(path + formFile.getFileName());
byte[] buffer = new byte[8192];
int len;
while ((len = in.read(buffer)) > 0) out.write(buffer, 0, len);
out.close();
formFile.destroy(); // 釋放暫存檔資源
}
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
UploadForm uf = (UploadForm) form;
try {
response.setCharacterEncoding("GBK");
saveFile(uf.getMyFile());
response.getWriter().println("上傳檔案成功.");
} catch (Exception e) {
response.getWriter().println(e.getMessage());
}
return null;
}
}
FormFile 主要方法:getInputStream()、getFileData()、getFileName()、getFileSize()、destroy()。
<form-bean name="uploadForm" type="actionform.UploadForm" />
<action name="uploadForm" path="/uploadFile" scope="request" type="action.UploadAction" />
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>uploadPath</param-name>
<param-value>D:\upload\</param-value> <!-- 必須以反斜線結尾 -->
</init-param>
</servlet>
<controller maxFileSize="2M" />
2K、5G),僅接受整數。ActionForm.validate() 或全域例外處理攔截。訪問 https://localhost:8080/samples/uploadFile.jsp 選擇檔案上傳,成功後顯示訊息,檔案出現在 D:\upload\ 目錄。
Struts 檔案上傳核心三要素:enctype="multipart/form-data"、FormFile 屬性、maxFileSize 控制器參數。掌握此流程,多檔上傳(教程 9)即為索引屬性與前端動態欄位的自然延伸。