文件上傳需表單設置 method="post" enctype="multipart/form-data"。Struts2 默認使用 Jakarta Commons FileUpload 組件,需引入:
commons-fileupload.jarcommons-io.jar可在 struts.xml 配置最大上傳大小(默認 2MB):
<constant name="struts.multipart.maxSize" value="2097152" />
<form action="fileupload" method="post" enctype="multipart/form-data"> 文件標題:<input type="text" name="title"/><br/> 選擇文件:<input type="file" name="upload"/><br/> <input type="submit" value="上傳"/> </form>
public class UploadAction extends ActionSupport {
private String title;
private File upload;
private String uploadContentType;
private String uploadFileName;
private String savePath; // 通過 DI 注入
// getter/setter 省略...
public String getSavePath() {
return ServletActionContext.getRequest().getRealPath(savePath);
}
public String execute() throws Exception {
FileOutputStream fos = new FileOutputStream(getSavePath() + "\\" + getUploadFileName());
FileInputStream fis = new FileInputStream(getUpload());
byte[] buffer = new byte[1024];
int len;
while ((len = fis.read(buffer)) > 0) {
fos.write(buffer, 0, len);
}
fos.close(); fis.close();
return SUCCESS;
}
}
<action name="fileupload" class="com.Struts2.load.UploadAction">
<interceptor-ref name="fileUpload">
<param name="allowedTypes">image/jpeg,image/jpg,image/gif,image/png</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"/>
<param name="savePath">/upload</param>
<result name="success">succ.jsp</result>
<result name="input">Error.jsp</result> <!-- 驗證失敗跳轉 -->
</action>
<img src="<s:property value="'/LearStruts2/upload/'+uploadFileName"/>"/>
<s:fielderror/>
JSP 中多個 <input type="file" name="uploads">,Action 屬性改為數組:
private File[] uploads; private String[] uploadsContentType; private String[] uploadsFileName; // 遍歷數組保存
<a href="down.action">圖片下載</a>
public class DownAction extends ActionSupport {
private String inputPath, contentType, filename;
// getter/setter...
public InputStream getTargetFile() throws Exception {
return ServletActionContext.getServletContext().getResourceAsStream(inputPath);
}
public String execute() {
inputPath = "/upload/1.jpg";
filename = "1.jpg";
contentType = "image/jpg";
return SUCCESS;
}
}
<action name="down" class="com.Struts2.load.DownAction">
<result name="success" type="stream">
<param name="contentType">${contentType}</param>
<param name="inputName">targetFile</param>
<param name="contentDisposition">attachment;filename="${filename}"</param>
<param name="bufferSize">50000000</param>
</result>
</action>
以上代碼經測試可用,詳細原理解析將在後續補充。