动态多附件上传
---- 经典解决方案
动态多附件上传,在目前的 B/S 系统中经常会遇到这方面的需求,基于开源的理念,在此我把几个解决方案做详细的介绍。目的在于提高自己的描述问题的能力,同时给遇到同样问题的朋友提供一些线索,以便节省宝贵时间。
上次项目是做一个 ** 管理系统,其中有一个模块是作品发布,作品发布模块就需要实现这样一个功能:
新建一个作品,作品包含一些基本的信息,而且要求要有一个或多个附件,每个附件又要求有作品概要(即作品附件和作品概要一一对应)。
系统要求用 struts 来实现。
在讨论解决方案之前,首先要了解的是。在客户端请求服务器时提交表单,表单的内容只能为 String 型和 FormFile 型( FormFile 类型只有在 Struts 中才有),不能提交自己定义的 dto 对象。但是可以提交自己定义的 dto 中的 String 成员和 FormFile 成员。
了解了这个原理之后,我开始阐述第一种解决方案;
第一种解决方案:间接动态多附件上传
基本思路: 定义一个 ProductForm 类
Class ProductForm extends ActionForm{
String pro_name;
……. // 其他一些基本的成员变量;
// 生成 get 和 set 方法;
}
在 jsp 页面上用相关的标签定义作品的字段;
如: <html:text property=”pro_name” />
动态多附件则用普通标签实现,没有在 ProductForm 中定义相应的字段。因此, Action 取值也不能直接从 ActionForm 中取值,因为 ActionForm 中根本没有相应的成员。
这里给出相关代码:
Jsp 部分:
< TABLE id = 'mytable' > < tr >< td > </ td > </ tr >
</ TABLE >
< html:button value = " 添加新附件 " styleClass = "btn" onclick = "add_Row(mytable);" property = "add_newFile" />
动态添加附件域在 jsp 中的代码是:
var i = 0;
function add_Row(the_table) { // 动态 增加一行, 实际 上也就是增加一个表格
var the_row,the_cell;
var cur_rows=the_table.rows.length;
the_row=cur_rows== null ?-1:(cur_rows);
// var i=the_row;
var newrow=the_table.insertRow(i); // 得到插入位置
newrow.id = i;
the_cell=newrow.insertCell(0);
the_cell.innerHTML= "<table width='359' border='0' cellspacing='0' id='table'>"
+ "<tr>"
+ "<td width='300'><input id=' <%= Constants.RES_NEW_FILE_PARAMETER_NAME %> " +i+ "' name=' <%= Constants.RES_NEW_FILE_PARAMETER_NAME %> " +i+ "' type='file' onchange='fileTypeCheck(this);' onpaste='return false' onkeypress='return false' onkeydown='return false' oncontextmenu='return false;'></td>"
+ "<td width='55'><input name='deleteRow' type='button' class='btn' value=' 删 除此域 ' onclick='del(" +i+ ");'></td>"
+ "</tr>"
+ "<tr>"
+ "<td ><span class='useBB'> 文件概要 说 明 [<=50 汉 字 ]</span></td>"
+ "<td class='style6'> </td>"
+ "</tr>"
+ "<tr>"
+ "<td>"
+ "<textarea name='" +i+ "' class='new_files_comnt' onchange='checkLength(this,100);'></textarea></td>"
+ "<td align='left' valign='top'> "