struts 动态多文件上传

来源:互联网 发布:东方财富 数据 编辑:程序博客网 时间:2024/06/03 03:05

 

Struts动态多文件上传

首先保证页面中的<input type="file">标签的名称name不同,struts标签property也一样。
包含这些<input>的<form>其属性必须为 enctype="multipart/form-data"  method="post"。
在formbean中,不需要定义类型为org.apache.struts.upload.FormFile的属性,也不需要List对象,建议使用DynaActionForm。
action中取出上传的文件代码:
DynaActionForm dyForm = (DynaActionForm) form;
Hashtable files = dyForm.getMultipartRequestHandler().getFileElements();
for (Enumeration e = files.keys(); e.hasMoreElements();) {
FormFile formfile = (FormFile) files.get((String) e.nextElement());
                if (formfile != null && formfile.getFileSize() > 0) {
这里你可以使用formfile.getInputStream()来获取一个文件的输入流进行保存。
                }
      }
 
这样就可以动态的在页面中添加上传文件的<input type="file">,不过究竟可以允许上传多少个还没有进行测过。
 
其实在ActionForm对象的MultipartRequestHandler属性中存放了从页面上传服务器的原始数据,所有<form>中的上传数据都可以找到。
Hashtable getAllElements() 所有的标签
Hashtable getFileElements()   所有文件标签
Hashtable getTextElements() 所有文本标签
 
其返回的Hashtable可以通过get("标签name")获得对象数组
 
如:
页面中为<input type="text" name="name">
在formbean中没有该name属性,
在action中获得其value为
String name[] = (String[])dyForm.getMultipartRequestHandler().getTextElements().get("name");
String n = name[0];
如果页面中有两个<input type="text" name="name">标签
则name.length()为2。
String name1 = name[0];
String name2 = name[1];      
许多页面动态上传数据往往可以通过这种方法来取。
 
另外需要注意的是页面传入的数据存HttpServletRequest parameter对象中,无论是否使用Struts,都可以通过request.getParameter("标签名")获取value。
同时此数据会在Action结束后传回ActionForward对象页面(redirect=false)
即:页面A--提交-->StrutsAction--返回-->页面B,在页面B中仍可以取得页面A的上传数据,通过${param.页面A标签名}、reuqest.getParameter或者使用Struts标签<bean:write name="formbean名" property="formbean属性名"/>
但是如果页面<form>标签属性enctype="multipart/form-data"此时表单上传的数据在HttpServletRequest parameter对象中的生存周期只到StrutsAction,无法到达页面B。
即:在StrutsAction中可以使用reuqest.getParameter("name")获取,但在页面B中无法通过${param.页面A标签名}、reuqest.getParameter获得,而Struts标签不受影响。这点需要留意。
普通的request是HttpServletRequest,如果用enctype="multipart/form-data"的话,request就变成了MultipartRequestWrapper。
下面是struts的源代码:
protected HttpServletRequest processMultipart(HttpServletRequest request) {
    if (!"POST".equalsIgnoreCase(request.getMethod())) {
        return (request);
    }
   
    String contentType = request.getContentType();
    if ((contentType !=null) &&
        contentType.startsWith("multipart/form-data")) {
        return (new MultipartRequestWrapper(request));
    }else{
        return (request);
    }
  }
 

原创粉丝点击