使用Struts2控制文件上傳
為了能夠上傳文件,我們必須將表單的method 設置為 POST ,將 entype 設置為 multipart/form-data ,只有在這種情況下,瀏覽器才會把用戶選擇文件的二進制數據發送給服務器。
一旦我們設置了enctype為multipart/form-data,此時瀏覽器將采用二進制流的方式來處理表單數據。但是Struts 2并沒有提供自己的請求解析器,也就是說Struts 2不會自己去處理multipart/form-data的請求,他需要調用其他上傳框架來解析二進制請求數據。
在Struts 2的struts.properties配置文件中,我們可以看到如下配置代碼,它主要用于配置Struts 2上傳文件時的上傳解析器
#指定使用cos的文件上傳解析器
struts.multipart.parser=cos
#指定使用Pell的文件上傳解析器
struts.multipart.parser=pell
#Struts 2默認使用Jakarta的common-FileUpload的文件上傳解析器
struts.multipart.parser=jakarta
下面將以Struts 2默認的文件上傳支持為例:
對于上傳頁面,為了完成文件上傳,我們應該講這個表單域的enctype屬性設置為“multipart/form-data”,method屬性設置為“POST”
如下:
<s:form action="upload" enctype="multipart/form-data" method="post">
<s:textfield name="title" label="文件標題"></s:textfield><br/>
<s:file name="upload" label="選擇文件"></s:file>
<s:submit value="上傳"></s:submit>
</s:form>
當該頁面提交請求時,請求發送到upload.action。這是Struts 2的一個Action。
實現文件上傳的Action
Struts 2的Action無須負責處理HttpServletRequest請求。Struts 2框架負責解析HttpServletRequest請求中的參數,包括文件域,Struts 2使用File類型來封裝文件域。
處理上傳請求的Action類代碼:
public class UploadAction extends ActionSupport {
private String title; // 封裝文件標題請求參數
private File upload; // 上傳文件域
private String uploadContentType; // 上傳文件的類型
private String uploadFileName; // 上傳文件名的屬性
// 直接在struts.xml文件中配置的屬性
private String savePath;
// 接受struts.xml文件配置值的方法
public void setSavePath(String savePath) {
this.savePath = savePath;
}
// 返回上傳文件的保存位置
private String getSavePath() throws Exception {
return ServletActionContext.getServletContext().getRealPath(savePath);
}
// 文章標題的setter和getter方法
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
//上傳文件對應文件內容的setter和getter方法
public File getUpload() {
return upload;
}
public void setUpload(File upload) {
this.upload = upload;
}
//上傳文件的文件類型的setter和getter方法
public String getUploadContentType() {
return uploadContentType;
}
public void setUploadContentType(String uploadContentType) {
this.uploadContentType = uploadContentType;
}
//上傳文件的文件名的setter和getter方法
public String getUploadFileName() {
return uploadFileName;
}
public void setUploadFileName(String uploadFileName) {
this.uploadFileName = uploadFileName;
}
@Override
public String execute() throws Exception {
//以服務器的文件保存地址和原文件名建立上傳文件輸出流
FileOutputStream fos = new FileOutputStream(getSavePath()+"\\"+getUploadFileName());
FileInputStream fis = new FileInputStream(getUpload());
byte[] buffer = new byte[1024];
int len = 0;
while ((len = fis.read(buffer))>0) {
fos.write(buffer,0,len);
}
return SUCCESS ;
}
} 上面的Action提供了兩個屬 性:uploadFileName和uploadContentType,這個兩個屬性分別用于封轉上傳文件的文件名、上傳文件的文件類型。Action 類直接通過File類型屬性直接封裝了上傳文件的文件內容,但是這個File屬性無法獲取上傳文件的文件名和類型,所以Struts 2直接將文件域中包 含的上傳文件名和文件類型的信息封裝到uploadFileName和uploadContentType屬性中,。可以認為:如果表單中包含一個 name屬性為XXX的文件域,則對應Action需要使用三個屬性來封裝該文件域的信息
1、類型為File的xxx屬性封裝另外該文件域對應的文件內容。
2、類型為String的xxxFileName屬性封裝了該文件域對應的文件名。
3、類型為String的xxxContentType屬性封裝了該文件域對應的文件的文件類型。
通過上面的3個屬性,可以更簡單地實現文件屬性,所以在execute方法中,可以直接通過調用getXxx()方法來獲取上傳文件的文件名、文件類型和文件內容。
配置文件上傳的Action
配置該Action時,還需要配置一個<param.../>元素,該元素用于為該Action的屬性動態分配屬性值:
<package name="uploadaction" extends="struts-default">
<action name="upload" class="com.app.action.UploadAction">
<!-- 動態設置Action的屬性值 -->
<param name="savePath">/upload</param>
<result name="success">/success.jsp</result>
</action>
</package> 配置了改Action應用后,我們就可以上傳文件了。該上傳請求將會被UploadAction處理,處理結束后會轉入到success.jsp頁面中,該頁面主要是用于顯示上傳的圖片,來驗證是否上傳成功上傳成功!!<br />
文件標題:<s:property value="+title"/>
文件為:<img src="<s:property value="'upload/'+uploadFileName"/>"><Br /> 如果上傳成功就可以看到如許頁面:

轉自:http://blog.csdn.net/chenssy/article/details/7341878