JS+Struts2多文件上传完整示例



JS+Struts2多文件上传完整示例。1、JSP页面: JS控制增加删除多个上传文件框,代码如下:

  1. <%@ page language=”java” pageEncoding=”UTF-8″%>
  2. <%@ taglib prefix=”s” uri=”/struts-tags”%>
  3. <!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
  4. <html xmlns=”http://www.w3.org/1999/xhtml”>
  5.     <head>
  6.         <%@include file=”../../_head.html”%>
  7.         <title>文件上传</title>
  8.         <meta http-equiv=”pragma” content=”no-cache”>
  9.         <meta http-equiv=”cache-control” content=”no-cache”>
  10.         <meta http-equiv=”expires” content=”0″>
  11.         <script language=”javascript” type=”text/javascript”
  12.             src=”../js/common/common.js”></script>
  13.         <script type=”text/javascript”>
  14.               var pos = 1;
  15.               function addFileComponent() {
  16.                 var elTable = document.getElementById(‘uploadTable’).getElementsByTagName(‘tbody’)[0];
  17.                 var elTr = document.getElementById(‘fileTr’);
  18.                 var elTr2 = document.getElementById(‘op’);
  19.                 var newEleTr = elTr.cloneNode(true);
  20.                 newEleTr.id = “fileTr” + pos;
  21.                 newEleTr.style.display = “”;
  22.                 inputs = newEleTr.getElementsByTagName(‘input’);
  23.                 inputs[0].id=”file” + pos;
  24.                 var elInput = inputs[1];
  25.                 elInput.onclick=delFileComponent;
  26.                 elInput.id=”delbutton” + pos++;
  27.                 elTable.insertBefore(newEleTr, elTr2);
  28.              }
  29.             function delFileComponent() {
  30.                 var elTable = document.getElementById(‘uploadTable’).getElementsByTagName(‘tbody’)[0];
  31.                 var trArr = elTable.getElementsByTagName(“tr”);
  32.                 var el = event.srcElement;
  33.                 for(j = 0; j < trArr.length; j++) {
  34.                     tr = trArr[j];
  35.                     if(tr.getElementsByTagName(“input”)[1] == el) {
  36.                         elTable.removeChild(tr);
  37.                         pos–;
  38.                         break;
  39.                     }
  40.                 }
  41.             }
  42.             function isValidateFile(obj){
  43.                var extend = obj.value.substring(obj.value.lastIndexOf(“.”)+1);
  44.                if(extend==”"){
  45.                }else{
  46.                    if(!(extend==”xls”||extend==”doc”)){
  47.                       alert(“请上传后缀名为xls或doc的文件!”);
  48.                       var nf = obj.cloneNode(true);
  49.                       nf.value=”;
  50.                       obj.parentNode.replaceChild(nf, obj);
  51.                       return false;
  52.                    }
  53.                }
  54.                return true;
  55.             }
  56.         </script>
  57.     </head>
  58.     <body>
  59.         <%@ include file=”/common/message.jsp”%>
  60.         <div class=”body-box”>
  61.             <div class=”rhead”>
  62.                 <div class=”rpos”>
  63.                     文件上传(可同时上传多份文件)
  64.                 </div>
  65.                 <div class=”clear”></div>
  66.             </div>
  67.             <s:form id=”ops” action=”csc_mUploadFile” theme=”simple”
  68.                 cssClass=”rhead”  enctype = “multipart/form-data”>
  69.                 <table id=”uploadTable” width=”100%” border=”0″>
  70.                     <tr>
  71.                         <td>
  72.                             <input type=”file” id=”file0″ name=”uploadFile” size=”50″
  73.                                 onchange=”isValidateFile(this);” />
  74.                         </td>
  75.                     </tr>
  76.                     <tr id=”fileTr” style=”display: none;”>
  77.                         <td>
  78.                             <input type=”file” size=”50″ name=”uploadFile”
  79.                                 onchange=”isValidateFile(this);” />
  80.                             &nbsp;
  81.                             <input type=”button” value=”删除” />
  82.                         </td>
  83.                     </tr>
  84.                     <tr id=”op”>
  85.                         <td>
  86.                             <input type=”submit” id=”uploadbutton” value=”上传” />
  87.                             &nbsp;
  88.                             <input type=”button” value=”添加” id=”addbutton”
  89.                                 onClick=”addFileComponent();” />
  90.                             &nbsp;
  91.                         </td>
  92.                     </tr>
  93.                 </table>
  94.             </s:form>
  95.             <table class=”pn-ltable” width=”100%” cellspacing=”1″ cellpadding=”0″
  96.                 border=”0″>
  97.                 <thead class=”pn-lthead”>
  98.                     <tr>
  99.                         <th>
  100.                             序号
  101.                         </th>
  102.                         <th>
  103.                             文件名
  104.                         </th>
  105.                         <th>
  106.                             上传时间
  107.                         </th>
  108.                     </tr>
  109.                 </thead>
  110.                 <tbody class=”pn-ltbody”>
  111.                     <tr onmouseover=”Pn.LTable.lineOver(this);”
  112.                         onmouseout=”Pn.LTable.lineOut(this);”
  113.                         onclick=”Pn.LTable.lineSelect(this);”>
  114.                         <td>
  115.                         </td>
  116.                         <td>
  117.                         </td>
  118.                         <td>
  119.                         </td>
  120.                     </tr>
  121.                 </tbody>
  122.             </table>
  123.         </div>
  124.     </body>
  125. </html>
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
	<head>
		<%@include file="../../_head.html"%>
		<title>文件上传</title>
		<meta http-equiv="pragma" content="no-cache">
		<meta http-equiv="cache-control" content="no-cache">
		<meta http-equiv="expires" content="0">
		<script language="javascript" type="text/javascript"
			src="../js/common/common.js"></script>
		<script type="text/javascript">

		      var pos = 1;

		      function addFileComponent() {
				var elTable = document.getElementById('uploadTable').getElementsByTagName('tbody')[0];
				var elTr = document.getElementById('fileTr');
				var elTr2 = document.getElementById('op');
				var newEleTr = elTr.cloneNode(true);
				newEleTr.id = "fileTr" + pos;		
				newEleTr.style.display = "";
				inputs = newEleTr.getElementsByTagName('input');
				inputs[0].id="file" + pos;
				var elInput = inputs[1];
				elInput.onclick=delFileComponent;
				elInput.id="delbutton" + pos++;
				elTable.insertBefore(newEleTr, elTr2);
			 }

			function delFileComponent() {
				var elTable = document.getElementById('uploadTable').getElementsByTagName('tbody')[0];
				var trArr = elTable.getElementsByTagName("tr");
				var el = event.srcElement;
				for(j = 0; j < trArr.length; j++) {
					tr = trArr[j];
					if(tr.getElementsByTagName("input")[1] == el) {
						elTable.removeChild(tr);
						pos--;
						break;
					}
				}
			}

			function isValidateFile(obj){
			   var extend = obj.value.substring(obj.value.lastIndexOf(".")+1);
			   if(extend==""){
			   }else{
				   if(!(extend=="xls"||extend=="doc")){
				      alert("请上传后缀名为xls或doc的文件!");
				      var nf = obj.cloneNode(true);
                      nf.value='';
                      obj.parentNode.replaceChild(nf, obj);
				      return false;
				   }
			   }
			   return true;
			}
		</script>
	</head>
	<body>
		<%@ include file="/common/message.jsp"%>
		<div>
			<div>
				<div>
					文件上传(可同时上传多份文件)
				</div>
				<div></div>
			</div>
			<s:form id="ops" action="csc_mUploadFile" theme="simple"
				cssClass="rhead"  enctype = "multipart/form-data">
				<table id="uploadTable" width="100%" border="0">
					<tr>
						<td>
							<input type="file" id="file0" name="uploadFile" size="50"
								onchange="isValidateFile(this);" />
						</td>
					</tr>
					<tr id="fileTr" style="display: none;">
						<td>
							<input type="file" size="50" name="uploadFile"
								onchange="isValidateFile(this);" />
							&nbsp;
							<input type="button" value="删除" />
						</td>
					</tr>
					<tr id="op">
						<td>
							<input type="submit" id="uploadbutton" value="上传" />
							&nbsp;
							<input type="button" value="添加" id="addbutton"
								onClick="addFileComponent();" />
							&nbsp;
						</td>
					</tr>
				</table>
			</s:form>
			<table width="100%" cellspacing="1" cellpadding="0"
				border="0">
				<thead>
					<tr>
						<th>
							序号
						</th>
						<th>
							文件名
						</th>
						<th>
							上传时间
						</th>
					</tr>
				</thead>
				<tbody>
					<tr onmouseover="Pn.LTable.lineOver(this);"
						onmouseout="Pn.LTable.lineOut(this);"
						onclick="Pn.LTable.lineSelect(this);">
						<td>
						</td>
						<td>
						</td>
						<td>
						</td>
					</tr>
				</tbody>
			</table>
		</div>
	</body>
</html>

2、Action后台处理上传文件:

Java代码 复制代码 收藏代码
  1.         //uploadFile对应页面<input type=”file” name=”uploadFile”>
  2. private List<File> uploadFile;
  3.         //文件名对应uploadFile+“FileName”,要不获取不到文件名
  4. private List<String> uploadFileFileName;
  5. // 文件上传
  6. public String mUploadFile() {
  7.    if (null == uploadFile) {
  8.     this.addActionError(“请上传文件!”);
  9.    } else {
  10.     String fileName = “”;
  11.       try {
  12.                       //在自己代码中控制文件上传的服务器目录
  13.          String directory = ServletActionContext.getServletContext().getRealPath(“/uploads”);
  14.                       //判断该目录是否存在,不存在则创建
  15.                       FileUtil.makeDir(directory);
  16.                       //循环处理上传的文件
  17.             for(int i=0,j=uploadFile.size();i<j;i++){
  18.                 fileName = uploadFileFileName.get(i);
  19.                 String filePath = directory + File.separator + fileName;
  20.                 FileUtil.uploadFile(uploadFile.get(i), new File(filePath));
  21.             }
  22.         } catch (IOException e) {
  23.                 this.addActionMessage(“”);
  24.         }
  25.            this.addActionMessage(“文件上传成功!”);
  26.     }
  27.     return “fileUpload”;
  28. }
         //uploadFile对应页面<input type="file" name="uploadFile">
	private List<File> uploadFile;
         //文件名对应uploadFile+“FileName”,要不获取不到文件名
	private List<String> uploadFileFileName;   
	// 文件上传
	public String mUploadFile() {
	   if (null == uploadFile) {
		this.addActionError("请上传文件!");
	   } else {
		String fileName = "";
		  try {
                       //在自己代码中控制文件上传的服务器目录
		     String directory = ServletActionContext.getServletContext().getRealPath("/uploads");
                       //判断该目录是否存在,不存在则创建
                       FileUtil.makeDir(directory);
                       //循环处理上传的文件
				for(int i=0,j=uploadFile.size();i<j;i++){
					fileName = uploadFileFileName.get(i);
					String filePath = directory + File.separator + fileName;
					FileUtil.uploadFile(uploadFile.get(i), new File(filePath));
				}
			} catch (IOException e) {
                 this.addActionMessage("");
			}
            this.addActionMessage("文件上传成功!");
		}
		return "fileUpload";
	}

FileUtil代码如下:

Java代码 复制代码 收藏代码
  1. public class FileUtil {
  2.     private static final int BUFFER_SIZE = 16 * 1024;
  3.     public static void uploadFile(File src, File dst) throws IOException {
  4.         InputStream in = null;
  5.         OutputStream out = null;
  6.         try {
  7.             in = new BufferedInputStream(new FileInputStream(src), BUFFER_SIZE);
  8.             out = new BufferedOutputStream(new FileOutputStream(dst),
  9.                     BUFFER_SIZE);
  10.             byte[] buffer = new byte[BUFFER_SIZE];
  11.             while (in.read(buffer) > 0) {
  12.                 out.write(buffer);
  13.             }
  14.         } finally {
  15.             if (null != in) {
  16.                 in.close();
  17.             }
  18.             if (null != out) {
  19.                 out.close();
  20.             }
  21.         }
  22.     }
  23.     public static String getExtention(String fileName) {
  24.         int pos = fileName.lastIndexOf(“.”);
  25.         return fileName.substring(pos);
  26.     }
  27.     public static void makeDir(String directory) {
  28.         File dir = new File(directory);
  29.         if (!dir.isDirectory()) {
  30.             dir.mkdirs();
  31.         }
  32.     }
  33.     public static String generateFileName(String fileName)
  34.             throws UnsupportedEncodingException {
  35.         DateFormat format = new SimpleDateFormat(“yyMMddHHmmss”);
  36.         String formatDate = format.format(new Date());
  37.         String extension = fileName.substring(fileName.lastIndexOf(“.”));
  38.         fileName = new String(fileName.getBytes(“iso8859-1″), “gb2312″);
  39.         return fileName + “_” + formatDate + new Random().nextInt(10000)
  40.                 + extension;
  41.     }
  42. }
public class FileUtil {

	private static final int BUFFER_SIZE = 16 * 1024;

	public static void uploadFile(File src, File dst) throws IOException {

		InputStream in = null;
		OutputStream out = null;
		try {
			in = new BufferedInputStream(new FileInputStream(src), BUFFER_SIZE);
			out = new BufferedOutputStream(new FileOutputStream(dst),
					BUFFER_SIZE);
			byte[] buffer = new byte[BUFFER_SIZE];
			while (in.read(buffer) > 0) {
				out.write(buffer);
			}
		} finally {
			if (null != in) {
				in.close();
			}
			if (null != out) {
				out.close();
			}
		}

	}

	public static String getExtention(String fileName) {
		int pos = fileName.lastIndexOf(".");
		return fileName.substring(pos);
	}

	public static void makeDir(String directory) {
		File dir = new File(directory);

		if (!dir.isDirectory()) {
			dir.mkdirs();
		}

	}

	public static String generateFileName(String fileName)
			throws UnsupportedEncodingException {
		DateFormat format = new SimpleDateFormat("yyMMddHHmmss");
		String formatDate = format.format(new Date());
		String extension = fileName.substring(fileName.lastIndexOf("."));
		fileName = new String(fileName.getBytes("iso8859-1"), "gb2312");
		return fileName + "_" + formatDate + new Random().nextInt(10000)
				+ extension;
	}

}

扩展: 1.可以实现带进度条的上传与下载; 2.可以用xml文件记录上传的文件清单,并且可以根据页面对上传文件的操作来修改相应的xml文件;