Struts2 內建對 Commons FileUpload 的支持,配合 Stream 結果類型實現文件下載。本文提供完整可運行代碼。
commons-fileupload-x.x.x.jarcommons-io-x.x.x.jar<s:form action="upload" enctype="multipart/form-data" method="post">
<s:textfield name="title" label="標題"/>
<s:file name="upload" label="選擇文件"/>
<s:submit value="文件上傳"/>
</s:form>
public class UploadAction extends ActionSupport {
private File upload; // 上傳文件
private String uploadContentType; // 文件類型
private String uploadFileName; // 原始文件名
private String savePath; // 保存相對路徑,由 struts.xml 注入
public String execute() throws Exception {
byte[] buffer = new byte[1024];
FileInputStream fis = new FileInputStream(upload);
FileOutputStream fos = new FileOutputStream(getSavePath() + "\\" + uploadFileName);
int len;
while ((len = fis.read(buffer)) > 0) fos.write(buffer, 0, len);
fis.close(); fos.flush(); fos.close();
return SUCCESS;
}
public String getSavePath() {
return ServletActionContext.getServletContext().getRealPath(savePath);
}
// getter/setter 省略
}
<action name="upload" class="cn.happy.action.UploadAction">
<param name="savePath">/upload</param>
<result name="success">upload_success.jsp</result>
</action>
您所上傳的文件是:<s:property value="uploadFileName"/> 文件類型:<s:property value="uploadContentType"/> 文件路徑:<s:property value="savePath"/>
<a href="download?fileName=007.jpg">點擊此處下載文檔</a>
public class FileDownAction extends ActionSupport {
private String inputPath; // 文件目錄,struts.xml 注入
private String fileName; // 請求參數 fileName
public InputStream getInputStream() throws FileNotFoundException {
String path = ServletActionContext.getServletContext().getRealPath(inputPath);
return new BufferedInputStream(new FileInputStream(path + "\\" + fileName));
}
// execute 返回 SUCCESS,getter/setter 省略
}
<action name="download" class="cn.happy.action.FileDownAction">
<param name="inputPath">/upload</param>
<result name="success" type="stream">
<param name="contentType">application/octet-stream</param>
<param name="inputName">inputStream</param>
<param name="contentDisposition">attachment;filename="${fileName}"</param>
<param name="bufferSize">4096</param>
</result>
</action>
| 文件類型 | Content-Type |
|---|---|
| Word | application/msword |
| Excel | application/vnd.ms-excel |
| PPT | application/vnd.ms-powerpoint |
| 圖片 | image/gif, image/jpeg, image/png |
| 文本 | text/plain |
| HTML | text/html |
| 二進制/未知 | application/octet-stream |
enctype="multipart/form-data" + <s:file> + Action 三屬性(文件、類型、文件名)。InputStream + type="stream" 結果 + contentDisposition 設置下載文件名。