很多應用都要求在一個界面中可以上傳多個文件,Struts 2框架也可以方便地支持多個文件同時上傳,一般可以使用數組和List來實現。
使用數組上傳多個文件
(1)upload.jsp文件。
<%@ page
language="java"
contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title>使用數組實現多個文件上傳</title>
</head>
<body>
<s:form action="doMultipleUploadUsingArray" method="POST" enctype="multipart/form-data">
<s:file label="文件1" name="upload" />
<s:file label="文件2" name="upload" />
<s:file label="文件3" name="upload" />
<s:submit value="上傳"/>
</s:form>
</body>
</html>
(2)在該form中,定義了3個具有相同名稱的文件域,所以需要在Action實現類中使用數組來封裝這3個文件域。使用數組多個上傳文件的業務控制器如代碼。
package ch11;
import java.io.File;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class MultipleFileUploadUsingArrayAction extends ActionSupport {
private File[] uploads;
private String[] uploadFileNames;
private String[] uploadContentTypes;
private String[] dir;
private String[] targetFileName;
//屬性的getter和setter方法
public File[] getUpload() {
return this.uploads;
}
public void setUpload(File[] upload) {
this.uploads = upload;
}
public String[] getUploadFileName() {
return this.uploadFileNames;
}
public void setUploadFileName(String[] uploadFileName) {
this.uploadFileNames = uploadFileName;
}
public String[] getUploadContentType() {
return this.uploadContentTypes;
}
public void setUploadContentType(String[] uploadContentType) {
this.uploadContentTypes = uploadContentType;
}
//文件上傳
public String upload() throws Exception {
// 獲得upload路徑的實際目錄
String realPath = ServletActionContext.getRequest().getRealPath(
"/upload");
//獲得實際目錄
String targetDirectory = realPath;
String[] mydir = new String[uploads.length];
String[] tname = new String[uploads.length];
for (int i = 0; i < uploads.length; i++) {
// 生成保存文件的文件名稱
tname[i] = generateFileName(uploadFileNames[i]);
// 保存文件的路徑
mydir[i] = targetDirectory + """" + tname[i];
// 建立一個目標文件
File target = new File(targetDirectory, tname[i]);
// 將臨時文件復制到目標文件
FileUtils.copyFile(uploads[i], target);
}
setDir(mydir);
setTargetFileName(tname);
return SUCCESS;
}
// 為上傳文件自動分配文件名稱,避免重復
private String generateFileName(String fileName) {
// 獲得當前時間
DateFormat format = new SimpleDateFormat("yyMMddHHmmss");
// 轉換為字符串
String formatDate = format.format(new Date());
// 隨機生成文件編號
int random = new Random().nextInt(10000);
// 獲得文件后綴名稱
int position = fileName.lastIndexOf(".");
String extension = fileName.substring(position);
// 組成一個新的文件名稱
return formatDate + random + extension;
}
//屬性的getter和setter方法
public String[] getDir() {
return dir;
}
public void setDir(String[] dir) {
this.dir = dir;
}
public String[] getTargetFileName() {
return targetFileName;
}
public void setTargetFileName(String[] targetFileName) {
this.targetFileName = targetFileName;
}
}
★說明★
使用數組上傳多個文件同上傳單個文件非常類似,并不復雜。
(3)在配置文件中增加如下配置:
<action name="doMultipleUploadUsingArray"
class="ch11.MultipleFileUploadUsingArrayAction"
method="upload">
<result>/ch11/multipleUploadUsingArray-success.jsp</result>
<result name="input">/ch11/multipleUploadUsingArray.jsp</result>
</action>
(4)multipleUploadUsingArray-success.jsp的內容如代碼所示。
代碼 multipleUploadUsingArray-success.jsp內容
<%@ page
language="java"
contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title>多個文件上傳示例</title>
</head>
<body>
<table border="1">
<!-- 使用迭代標簽-->
<s:iterator value="dir" status="stat">
<tr>
<td>文件名稱<s:property value="%{#stat.index}" /></td>
<td><s:property value="%{dir[#stat.index]}" /></td>
</tr>
</s:iterator>
</table>
<table border="1">
<!-- 使用迭代標簽-->
<s:iterator value="uploadContentType" status="stat">
<tr>
<td>文件類型<s:property value="%{#stat.index}" /></td>
<td><s:property value="%{uploadContentType[#stat.index]}" /></td>
</tr>
</s:iterator>
</table>
<table border="1">
<!-- 使用迭代標簽-->
<s:iterator value="+targetFileName" status="stat">
<tr>
<td>圖片<s:property value="%{#stat.index}" /></td>
<td><img src="<s:property value="'/bookcode/upload/'+targetFileName[#stat.index]"/>"/></td>
</tr>
</s:iterator>
</table>
</body>
</html>
(5)運行該示例,在瀏覽器中輸入http://localhost:8080/TestS/multipleUpload UsingArray.jsp,界面如圖所示。
使用數組上傳多個文件界面
(6)在這里,選擇3個gif文件,單擊“上傳”按鈕,結果如圖。
使用數組上傳多個文件結果
使用List上傳多個文件
使用List來上傳多個文件同數組基本相同,上傳JSP文件和success邏輯視圖的JSP文件均不用修改,只是需要相應的Action實現類即可。