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) {
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);
}
return (request);
}
String contentType = request.getContentType();
if ((contentType !=null) &&
contentType.startsWith("multipart/form-data")) {
return (new MultipartRequestWrapper(request));
}else{
return (request);
}
}