1.建立多檔案上傳頁面(multiFileUpload.jsp):
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'multiFileUpload.jsp' starting page</title>
<script type="text/javascript">
function addRow(){
//插入第一列
//var x=document.getElementById('fTable').insertRow(0);
//插入最後一列
//var x=document.getElementById('fTable').insertRow();
//抓取表格列數
var rows = document.getElementById('fTable').rows.length;
//插入指定的列
var x = document.getElementById('fTable').insertRow(rows-2);
var y=x.insertCell(0);
var z=x.insertCell(1);
y.innerHTML="檔案名稱:";
z.innerHTML="<input type=\"file\" name=\"upload\">";
}
function delRow(){
//刪除最後一列
//var x=document.getElementById('fTable').deleteRow();
//抓取表格列數
var rows = document.getElementById('fTable').rows.length;
//刪除指定的列
var x=document.getElementById('fTable').deleteRow(rows-3);
}
</script>
</head>
<body>
<font color="red"><s:actionerror/></font>
<font color="red"><s:fielderror/></font>
<form action="<%=path%>/multiFileUpload" method="post" enctype="multipart/form-data">
<table id="fTable">
<tr>
<td>檔案名稱:</td>
<td><input type="file" name="upload"></td>
</tr>
<tr>
<td>檔案名稱:</td>
<td><input type="file" name="upload"></td>
</tr>
<tr>
<td>檔案名稱:</td>
<td><input type="file" name="upload"></td>
</tr>
<tr>
<td colspan="2" align="left"><input type="button" value="冊除列" onclick="delRow()"> <input type="button" value="新增上傳檔案" onclick="addRow();"></td>
</tr>
<tr>
<td colspan="2" align="left"><input type="submit" value="上傳..."></td>
</tr>
</table>
</form>
</body>
</html>
2.建立上傳成功頁面(multiFileUpload_Success.jsp):
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'multiFileUpload_Success.jsp' starting page</title>
</head>
<body>
<font color="red">FileUpload ok!!</font>
<hr>
<s:iterator value="#request.list" id="f">
FullFileName:<s:property value="#f.fileName"/><br>
FileContentType:<s:property value="#f.contentType"/><br>
RealPath(Save):<s:property value="#f.savePath"/><br><br>
<hr color="blue">
</s:iterator>
</body>
</html>
3.建立上傳Action(FileUploadAction.java):
3.1.建立FileInfo class(FileInfo.java):
package com.bean.test;
public class FileInfo {
private String fileName;
private String contentType;
private String savePath;
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public String getContentType() {
return contentType;
}
public void setContentType(String contentType) {
this.contentType = contentType;
}
public String getSavePath() {
return savePath;
}
public void setSavePath(String savePath) {
this.savePath = savePath;
}
}
3.2.建立上傳Action(MultiFileUploadAction.java):
package com.action.test;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.struts2.ServletActionContext;
import com.bean.test.FileInfo;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class MultiFileUploadAction extends ActionSupport {
/**
*
*/
private static final long serialVersionUID = 1L;
private File[] upload;
private String[] uploadContentType;
private String[] uploadFileName;
private String savePath;
private String targetDir;
public File[] getUpload() {
return upload;
}
public void setUpload(File[] upload) {
this.upload = upload;
}
public String[] getUploadContentType() {
return uploadContentType;
}
public void setUploadContentType(String[] uploadContentType) {
this.uploadContentType = uploadContentType;
}
public String[] getUploadFileName() {
return uploadFileName;
}
public void setUploadFileName(String[] uploadFileName) {
this.uploadFileName = uploadFileName;
}
public String getSavePath() {
this.savePath = ServletActionContext.getServletContext().getRealPath(getTargetDir());
return savePath;
}
public void setSavePath(String savePath) {
this.savePath = savePath;
}
public String getTargetDir() {
return targetDir;
}
public void setTargetDir(String targetDir) {
this.targetDir = targetDir;
}
@Override
public String execute() throws Exception {
return doUpload();
}
@SuppressWarnings("unchecked")
public String doUpload(){
if(upload==null){
this.addActionError("請選擇檔案!!");
return INPUT;
}
Map request = (Map)ActionContext.getContext().get("request");
List list = new ArrayList();
for(int i=0;i<this.upload.length;i++){
String path = this.upload[i].getPath();
try {
FileInputStream in = new FileInputStream(path);
FileOutputStream os = new FileOutputStream(this.getSavePath()+"\\"+this.uploadFileName[i]);
try {
byte[] b = new byte[1024];
int len=0;
while((len=in.read(b))>0){
os.write(b,0,len);
}
os.close();
in.close();
} catch (IOException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
FileInfo fi = new FileInfo();
fi.setFileName(this.getUploadFileName()[i]);
fi.setContentType(this.getUploadContentType()[i]);
fi.setSavePath(this.getSavePath());
list.add(fi);
}
request.put("list", list);
return SUCCESS;
}
}
4.於struts.xml(src目錄下)加入Struts2 Action:
<action name="multiFileUpload" class="com.action.test.MultiFileUploadAction">
<interceptor-ref name="fileUpload">
<!-- 可以上傳之檔案格式 -->
<param name="allowedTypes">
image/png,
image/gif,
image/jpeg,
text/plain,
text/html,
application/octet-stream,
application/msword,
application/vnd.openxmlformats-officedocument.wordprocessingml.document,
application/x-zip-compressed
</param>
<!-- 單一檔案之最大可上傳檔案大小 -->
<param name="maximumSize">4096000</param>
</interceptor-ref>
<interceptor-ref name="defaultStack" />
<result>/test/multiFileUpload_Success.jsp</result>
<result name="input">/test/multiFileUpload.jsp</result>
<param name="targetDir">\\upload</param>
</action>
若需限制每次檔案最大可上傳之大小,可加入下面參數於struts.xml內:
<!-- 一次最大上傳之檔案大小 --> <constant name="struts.multipart.maxSize" value="10240000"></constant>
指定上傳之暫存檔之目錄,可加入下面參數於struts.xml內:
<!-- temp dir --> <constant name="struts.multipart.saveDir" value="C:\\Program Files (x86)\\Apache Software Foundation\\Tomcat 6.0\\webapps\\Demo\\upload"></constant>
5.測試結果:


看到此畫面,恭喜您實作Struts2多檔案上傳範例成功!
沒有留言:
張貼留言