Struts轻松搞定多文件上传

在前面的《Apache Commons FileUpload实现多文件上传》文章中介绍了http://使用第三方组件ApacheCommons FileUpload来实现多文件的上传,对比今天用struts实现的多文件上传,总觉得还是struts用起来更加顺手,也更加简洁方便,不忍自己独享,所以拿出来跟大家一块分享一下。如果你读过前面提到的那篇文章,相信再理解本文将会更加容易,另外提供源码以方便大家学习(点此下载源码)。由于本文属于一片纯技术文章,废话就不多说了,下面看一下struts是如何实现多文件上传的吧。

1.      首先来看前台。在前台页面中通过js实现上传控件的添加和删除。描述的详细一些就是点一下“增加一行”按钮就会增加一个上传控件,同样点击该控件后边的“删除”则会将该上传控件去除。目的在于用js实现添加任意数目的文件的功能。

<%@ page language="java" pageEncoding="GB18030"%>

<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
  

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <head>
    <title>multiUploadDemo</title>
	<script type="text/javascript" src="js/myjs.js">
	
	</script>
 </head>
    <body bgcolor="#ffffff">
	   <div id="status"></div>
	      
	   <form method="post" action="upload.do" enctype="multipart/form-data" >
	
		    <table id="tb"></table>

		    <input type="button" name="AddOnLine" value="增加一行" οnclick="additem('tb')"/>
		    <input type="submit" name="btnUpload" value="上传" οnclick="upload()"/>
    	</form>
    </body>
</html>

在前台页面中引用的js文件中的代码如下:

 var num = 0;

     function upload(){
      	 document.getElementById("status").innerHTML = "文件上传中...";
       }

    function additem(id)
    {
     var row,cell,str;

     row = eval("document.all["+'"'+id+'"'+"]").insertRow();
     if(row != null )
        {
           cell = row.insertCell();
           str="<input type="+'"'+"file"+'"'+" name=uploadFile["+ num +"].file><input type="+'"'+"button"+'"'+" value="+'"'+"删除"+'"'+" οnclick='deleteitem(this,"+'"'+"tb"+'"'+");'>"
          cell.innerHTML=str;
        }
     num++;
    }
    function deleteitem(obj,id)
    {
     var rowNum,curRow;
     curRow = obj.parentNode.parentNode;
     rowNum = eval("document.all."+id).rows.length - 1;
     eval("document.all["+'"'+id+'"'+"]").deleteRow(curRow.rowIndex);
    }
    function callback(msg)
    {
     document.getElementById("status").innerHTML = "文件上传完成...<br>" + msg;
    }

2.      前台页面在实现了动态添加上传控件的功能后,真正用来上传文件的后台代码就要隆重登场了,后台代码中新建三个类,他们分别为UploadActionForm.java,UploadFile.java以及UploadTestAction.java。

UploadActionForm.java类代码如下:

package myupload;
import java.util.ArrayList;
import java.util.List;

import org.apache.struts.action.ActionForm;
import org.apache.struts.upload.FormFile;

public class UploadActionForm extends ActionForm {
	
		private List myFiles;

		public UploadActionForm() {
			myFiles = new ArrayList();
			
		}

		public List getMyFiles() {
			return myFiles;
		}

		// 注意这个方法的定义 不加中间的循环是会出错的

		public UploadFile getUploadFile(int index) {
			int size = myFiles.size();
			if (index > size - 1) {
				for (int i = 0; i < index - size + 1; i++) {
					myFiles.add(new UploadFile());
				}
			}
			return (UploadFile) myFiles.get(index);
		}

		public void setMyFiles(List myFiles) {
			this.myFiles = myFiles;
		}
}

UploadFile.java类代码如下:

package myupload;

import java.io.Serializable;

import org.apache.struts.upload.FormFile;

public class UploadFile implements Serializable {
	private FormFile file;

	public FormFile getFile() {
		System.out.println("run  in  uploadFile.getFile()");
		return file;
	}

	public void setFile(FormFile file) {
		this.file = file;
	}
}

UploadTestAction.java类代码如下:

package myupload;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.upload.FormFile;

import antlr.collections.List;

public class UploadTestAction extends Action {
	public ActionForward execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws IOException, ServletException {


		UploadActionForm multiUploadForm = (UploadActionForm) form;

		ArrayList myFiles = (ArrayList)multiUploadForm.getMyFiles();
		String fileStr = "";
		
		System.out.println(myFiles.size());
		for (int i = 0; i < myFiles.size(); i++) {
			UploadFile uploadFile = (UploadFile) myFiles.get(i);
			FormFile file = uploadFile.getFile();

			if (file == null) {
				System.out.println("file  is  null");
			} else {
				
				FileOutputStream fos = new FileOutputStream("H:\\" + file.getFileName());
				fos.write(file.getFileData());
				fos.flush();
				fos.close();

			}
		}		
		return mapping.findForward("success");

	}
}
最后就是我们的struts-config.xml文件了:

<?xml version="1.0" encoding="ISO-8859-1" ?>

<!DOCTYPE struts-config PUBLIC
          "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
          "http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">

<struts-config>
	<form-beans>	
		<form-bean name="uploadForm" type="myupload.UploadActionForm"/>	
	</form-beans>
	
	<action-mappings>
		<action path="/upload"
				type="myupload.UploadTestAction"
				name="uploadForm"
				scope="request"
		>
			<forward name="success" path="/upload_success.jsp"/>
		</action>
	</action-mappings>
	

	<controller maxFileSize="10M"/>
</struts-config>


该文件中配置了jsp页面提交后交由哪个Action进行处理的具体信息,以及上传成功后的页面跳转信息。相信通过应用struts你会发现实现多文件上传会是一件更简单的事情。





  • 7
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 15
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值