Struts2教程7:上傳任意多個文件
上一篇:Struts2教程6:在Action類中獲得HttpServletResponse對象的四種方法
一、上傳單個文件
上傳文件是很多Web程序都具有的功能。在Struts1.x中已經提供了用于上傳文件的組件。而在Struts2中提供了一個更為容易操作的上傳文件組件。所不同的是,Struts1.x的上傳組件需要一個ActionForm來傳遞文件,而Struts2的上傳組件是一個攔截器(這個攔截器不用配置,是自動裝載的)。在本文中先介紹一下如何用struts2上傳單個文件,最后介紹一下用struts2上傳任意多個文件。
要用Struts2實現上傳單個文件的功能非常容易實現,只要使用普通的Action即可。但為了獲得一些上傳文件的信息,如上傳文件名、上傳文件類型以及上傳文件的Stream對象,就需要按著一定規則來為Action類增加一些getter和setter方法。
在Struts2中,用于獲得和設置java.io.File對象(Struts2將文件上傳到臨時路徑,并使用java.io.File打開這個臨時文件)的方法是getUpload和setUpload。獲得和設置文件名的方法是getUploadFileName和setUploadFileName,獲得和設置上傳文件內容類型的方法是getUploadContentType和setUploadContentType。下面是用于上傳的動作類的完整代碼:
import java.io.*;
import com.opensymphony.xwork2.ActionSupport;
public class UploadAction extends ActionSupport
{
private File upload;
private String uploadFileName;
private String uploadContentType;
public String getUploadFileName()
{
return uploadFileName;
}
public void setUploadFileName(String fileName)
{
this.uploadFileName = fileName;
}
public File getUpload()
{
return upload;
}
public void setUpload(File upload)
{
this.upload = upload;
}
public void setUploadContentType(String contentType)
{
this.uploadContentType=contentType;
}
public String getUploadContentType()
{
return this.uploadContentType;
}
public String execute() throws Exception
{
java.io.InputStream is = new java.io.FileInputStream(upload);
java.io.OutputStream os = new java.io.FileOutputStream("d:\\upload\\" + uploadFileName);
byte buffer[] = new byte[8192];
int count = 0;
while((count = is.read(buffer)) > 0)
{
os.write(buffer, 0, count);
}
os.close();
is.close();
return SUCCESS;
}
}
在execute方法中的實現代碼就很簡單了,只是從臨時文件復制到指定的路徑(在這里是d:\upload)中。上傳文件的臨時目錄的默認值是javax.servlet.context.tempdir的值,但可以通過struts.properties(和struts.xml在同一個目錄下)的struts.multipart.saveDir屬性設置。Struts2上傳文件的默認大小限制是2M(2097152字節),也可以通過struts.properties文件中的struts.multipart.maxSize修改,如struts.multipart.maxSize=2048 表示一次上傳文件的總大小不能超過2K字節。
下面的代碼是上傳文件的JSP頁面代碼:<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<title>上傳單個文件</title>
</head>
<body>
<s:form action="upload" namespace="/test"
enctype="multipart/form-data">
<s:file name="upload" label="輸入要上傳的文件名" />
<s:submit value="上傳" />
</s:form>
</body>
</html>
也可以在success.jsp頁中通過<s:property>獲得文件的屬性(文件名和文件內容類型),代碼如下:
<s:property
value="uploadFileName"/>
在Struts2中,上傳任意多個文件也非常容易實現。首先,要想上傳任意多個文件,需要在客戶端使用DOM技術生成任意多個<input type=”file” />標簽。name屬性值都相同。代碼如下:
<head>
<script language="javascript">
function addComponent()
{
var uploadHTML = document.createElement( "<input type='file' name='upload'/>");
document.getElementById("files").appendChild(uploadHTML);
uploadHTML = document.createElement( "<p/>");
document.getElementById("files").appendChild(uploadHTML);
}
</script>
</head>
<body>
<input type="button" onclick="addComponent();" value="添加文件" />
<br />
<form onsubmit="return true;" action="/struts2/test/upload.action"
method="post" enctype="multipart/form-data">
<span id="files"> <input type='file' name='upload' />
<p />
</span>
<input type="submit" value="上傳" />
</form>
</body>
</html>
import java.io.*;
import com.opensymphony.xwork2.ActionSupport;
public class UploadMoreAction extends ActionSupport
{
private java.util.List<File> uploads;
private java.util.List<String> uploadsFileName;
private java.util.List<String> uploadsContentType;
public java.util.List<String> getUploadsFileName()
{
return uploadFileName;
}
public void setUploadFileName(java.util.List<String> fileNames)
{
this.uploadFileName = fileNames;
}
public java.util.List<File> getUploads()
{
return uploads;
}
public void setUploads(java.util.List<File> uploads)
{
this.uploads = uploads;
}
public void setUploadsContentType(java.util.List<String> contentTypes)
{
this.uploadsContentType = contentTypes;
}
public java.util.List<String> getUploadsContentType()
{
return this.uploadsContentType;
}
public String execute() throws Exception
{
if (uploads != null)
{
int i = 0;
for (; i < uploads.size(); i++)
{
java.io.InputStream is = new java.io.FileInputStream(uploads.get(i));
java.io.OutputStream os = new java.io.FileOutputStream(
"d:\\upload\\" + uploadsFileName.get(i));
byte buffer[] = new byte[8192];
int count = 0;
while ((count = is.read(buffer)) > 0)
{
os.write(buffer, 0, count);
}
os.close();
is.close();
}
}
return SUCCESS;
}
}
在execute方法中,只是對List對象進行枚舉,在循環中的代碼和上傳單個文件時的代碼基本相同。如果讀者使用過struts1.x的上傳組件,是不是感覺Struts2的上傳功能更容易實現呢?在Struts1.x中上傳多個文件時,可是需要建立帶索引的屬性的。而在Struts2中,就是這么簡單就搞定了。圖1是上傳任意多個文件的界面。

圖1
在本文中給出了用Struts2上傳任意多個文件的一個方法,如果哪位讀者有更好的方法,請跟貼!
下一篇:Struts2教程8:攔截器概述
《Android高薪之路:Android程序員面試寶典 》http://book.360buy.com/10970314.html
新浪微博:http://t.sina.com.cn/androidguy 昵稱:李寧_Lining
posted on 2008-04-27 21:47 銀河使者 閱讀(24681) 評論(40) 編輯 收藏 所屬分類: Struts2 、 原創