`

[code]SSH上传下载 ------温故知新

    博客分类:
  • SSH
阅读更多
servlet上传,之前是用fileupload;
但struts对fileupload再封装了,就用struts的支持

http://struts.apache.org/1.1/api/index.html

这篇文章写得几好,不似网上大部分的文章~~~~
http://fafrei.spaces.live.com/blog/cns!BA7166EED9411B70!1170.entry



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);
    }
  }
分享到:
评论
1 楼 yezhuzhe 2012-08-14  

相关推荐

Global site tag (gtag.js) - Google Analytics