一、要實現文件上傳,需在項目中添加兩個jar文件

二、上傳准備的頁面
注:必須植入enctype="multipart/form-data"屬性,以及提交方式要設置成post
<h2>單個文件上傳</h2>
<s:form action="upload.action" enctype="multipart/form-data" method="post">
<s:textfield name="title" label="標題"/>
<s:file name="upload" label="選擇文件"/><br/>
<s:submit name="submit" value="上傳文件"></s:submit>
</s:form>
實現文件上傳的Action類
public class UploadAction extends ActionSupport{ //封裝上傳文件屬性 private File upload; //封裝上傳文件的類型 private String uploadContentType; //封裝上傳文件名稱 private String uploadFileName; //獲取文件上傳的路徑 private String savePath; @Override public String execute() throws Exception { byte[] buffer=new byte[1024]; //讀取文件 FileInputStream fis=new FileInputStream(getUpload()); //保存文件 FileOutputStream fos=new FileOutputStream(getSavePath()+"\\"+this.getUploadFileName()); int length=fis.read(buffer); while(length>0){ //每次寫入length長度的內容 fos.write(buffer,0,length); length=fis.read(buffer); } fis.close(); fos.flush(); fos.close(); return SUCCESS; }
//獲取文件上傳的保存路徑 通過讀取存放目錄獲得保存路徑
public String getSavePath() {
return ServletActionContext.getServletContext().getRealPath(savePath);
}
在Action中使用了三個屬性封裝文件信息:
File類型的XXX屬性,與表單的File控件的name屬性一樣,用於封裝File控件對應的文件內容
String類型的xxxFileName屬性,該屬性名稱由前面的File類型屬性和FileName組合,是固定的語法,是封裝File控件對應文件的文件名
String類型的XXXContentType屬性,同樣由xxx屬性和ContentType組合而成,是固定語法,封裝File控件對應文件的文件類型
配置Action:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <constant name="struts.devMode" value="true"></constant> <package name="default" namespace="/" extends="struts-default"> <!-- 文件上傳 --> <action name="upload" class="cn.happy.action.UploadAction"> <!-- 通過param參數設置保存目錄的路徑 --> <param name="savePath">/upload</param> <result name="success">ok.jsp</result> </action> </package> </struts>
上傳成功后的結果頁面:植入的value是Action類中所對應的實體類屬性
您所上傳的文件是:<s:property value="uploadFileName"/><br/>
文件類型:<s:property value="uploadContentType"/>
實現效果:


三、多文件上傳
與單文件上傳的不同之處在於 將三個屬性的類型修改成數組類型,並通過for循環進行遍歷
public class SomeUploadAction extends ActionSupport { // 封裝上傳文件屬性 private File[] upload; // 封裝上傳文件的類型 private String[] uploadContentType; // 封裝上傳文件名稱 private String[] uploadFileName; // 封裝文件上傳的路徑 private String savePath; public String execute() throws Exception { byte[] buffer = new byte[1024]; for (int i = 0; i < upload.length; i++) { FileInputStream fis = new FileInputStream(getUpload()[i]); FileOutputStream fos = new FileOutputStream(getSavePath() + "\\" + this.getUploadFileName()[i]); int length = fis.read(buffer); while (length > 0) { fos.write(buffer, 0, length); length = fis.read(buffer); } fos.flush(); fos.close(); fis.close(); } return SUCCESS; }
public String getSavePath() {
return ServletActionContext.getServletContext().getRealPath(savePath);
}
實現效果:


四、實現文件下載
為了支持文件的下載,Struts2框架提供了stream結果類型,該類型的作用就是專門用於實現文件下載的功能

實現文件下載:
由於在Struts2中實現文件下載時需要用到InputStream,所以在文件下載Action中要提供一個獲得InputStream的方法,通過這個輸入流將可以獲取希望下載的文件內容
public class DownAction extends ActionSupport{ //讀取下載文件的目錄 private String inputPath; //下載文件的文件名 private String fileName; //讀取下載文件的輸入流 private InputStream inputStream; //下載文件的類型 private String conetntType; @Override public String execute() throws Exception { return SUCCESS; } //創建InputStream輸入流 public InputStream getInputStream() throws FileNotFoundException { String path=ServletActionContext.getServletContext().getRealPath(inputPath); return new BufferedInputStream(new FileInputStream(path+"\\"+fileName)); }
通過Context上下文得到下載文件的實際路徑,並構建了一個InputStream輸入流實現文件下載讀取
Action配置:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <constant name="struts.devMode" value="true"></constant> <package name="default" namespace="/" extends="struts-default"> <!-- 文件下載 --> <action name="down" class="cn.happy.action.DownAction"> <param name="inputPath">/image</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> </package> </struts>
在配置文件中,contentType參數決定了下載文件的類型。不同文件類型對應的參數值也是不同的。
通常情況下,contentType參數直接設置為application/octet-stream即可
contentDispoistion參數由兩個部分組成,前面的部分表示處理文件的形式,如attachement表示在下載時彈出對話框,提示用戶保存或者直接打開文件,而后一部分表示下載文件的名稱,兩部分之間以“;”進行分隔

當單擊超鏈接時,即可下載



