动态增加文件上传,表单中的数据如何处理(hibernate ,struts)

heqingrong623 2008-05-21 04:38:03
问题的提出:
主要是在附件上传中动态增加附件数目上传后,对于 struts 中存放数据的actionForm不知道如何设置以及原理不太清楚。
下面是具体的问题描述。
-------------------------------
jsp页面部分代码:

<input type="button" name="Button" value=" 添加 " onclick="addFile()">//可以动态添加多个附件上传
<FORM METHOD="POST" ACTION="<c:url value='SystemBigSlave.xsg?command=save'/>"
ENCTYPE="multipart/form-data" name="systemBigSlave" target="_self">
<table width="75%" border="0" align="center" id="upfile">
<tr>
<td><input type="file" name="theFile[0]" size="30"></td>
</tr>
</table>
</form>

<script language="javascript">
var row=1;
function addFile(){//每点击一下添加按钮就生成一个上传条
row++;
var obj = document.getElementById("upfile");
var r = obj.insertRow().insertCell();
var temp="";
temp="<input type=file name=theFile["+row+"] size=30>";//这里命名的都是theFile开头
r.innerHTML+=temp;
}
</script>

那相对应的Form应该怎么写来对应上传上来的信息呢。而hibernate 中的设置文件呢?
以下是公司给出的解决办法大家帮我理解一下,让后说说你们各自有什么好的办法。

--------------------------------------------
form :

private Map fileMap = new HashMap();//声明一个集合来放多个file
public FormFile getTheFile(int index) {//取单个文件
return (FormFile) fileMap.get(new Integer(index));
}
//多附件同名上传
public void setTheFile(int index, FormFile file) {//set 下标是index的文件
fileMap.put(new Integer(index), file); //把文件放在map中
}
public FormFile[] getFiles() {//取出文件的集合
return (FormFile[]) fileMap.values().toArray(new FormFile[fileMap.size()]);
}
问题一: setTheFile()中,struts怎么来运行自己,让jsp中的="<input type=file name=theFile["+row+"] size=30>" 中的 theFile[i]字段与setTheFile(int index, FormFile file)对应起来呢?页面中字段theFile[0],theFile[2],那对应的struts 中的Form应该要有 setTheFile[0],setTheFile[1]与之对应才对。对于struts的机制还不太了解请大家指点。

------------------------------------------------
相对应的hibernate.xml文件只有一个对应
<property
name="FileName"
type="java.lang.String"
column="FileName"
>
...全文
171 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
JavaAlpha 2009-07-03
  • 打赏
  • 举报
回复
我用struts做表单和图片上传的时候在action里获取表单的内容总是为空
choaryzhang 2008-08-29
  • 打赏
  • 举报
回复
建议按照如下步骤完成:
1.JSP页面增加一个字段属性为formFile的文本框
<html:form action="FileTest.do?method=upload" enctype="multipart/form-data">
请选择文件:<html:file property="formfile"/>
<a href="javascript:void(addFile());" class="file">添加附件</a>
<div id="fileDiv">
<table id=conditionTable>
</table>
</div>
<html:submit property="" value="提交"/>
</html:form>
2.增加多行的JS脚本
<script type="text/javascript">
var i=0;
function addFile(){
i++;
var currRow=conditionTable.insertRow(); //插入当前行
var currCell=currRow.insertCell();//插入单元格
var currCellContext="<input type=file name=formfile_"+ i +">  <a href='javascript:void(0)' onclick='removeFile();'>去除</a><br/>";
currCell.innerHTML=currCellContext; //填充单元格
}

function removeFile(){
var o = findTD(event.srcElement);
conditionTable.deleteRow(o.parentElement.rowIndex);
}
//查找table中td对象
function findTD(o){
if (o.nodeName=="TR"||o.nodeName=="TABLE")
return;
if(o.nodeName=="TD")
return (o);
else
return (o.parentElement);
}
</script>

特别注意的是:addFile()方法中增加表单上传域的HTML代码<input type=file name=formfile_"+ i +"> 定义的一个变量i是为了区别每个上传表单域的name。方便我们在action里集中将这些转换成对象存入HASHTABLE,如果name一样,则只能有一个被存入HASHTABLE.
3.ActionForm 增加一字段 private FormFile formFile 对应页面上的那个上传文本框
4.Action 依次取得多附件上传信息
7. Action的设计。
以下是文件上传的代码。该代码可以实现多文件上传,也可以只上传一个文件。
利用actionForm.getMultipartRequestHandler().getFileElements();方法将表单中已有的上传域全部存进HASHTABLE,然后遍历,在通过FormFile转换成文件对象。在调用FormFile对象的get方法给VO对象赋值。最后将VO和FormFile一并交由DELEGEATE向下传递给DAO去处理。
说明:本例中完全可以只传递一个FormFile对象一个参数。但考虑到表单可能包含其他一些业务字段信息也需要传递,故设计成传递两个参数
public ActionForward upload(ActionMapping mapping, ActionForm actionForm,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
//多附件上传,也可以只有一个附件,看在JSP页面中如何设计
FileTestSVO info=new FileTestSVO();
Hashtable ht=actionForm.getMultipartRequestHandler().getFileElements();
for(Enumeration e =ht.keys();e.hasMoreElements();){
String key=(String)e.nextElement();
FormFile form=(FormFile)ht.get(key);
String filetype=form.getFileName().toLowerCase();
if(filetype.endsWith(".doc")||filetype.endsWith(".xls")||filetype.endsWith(".txt")){
info.setFilename(form.getFileName());
FileTestDelegate.getInstance().addFileBlob(info,form);
}
}
return mapping.findForward("init");
}

这样就可以完成多附件上传咯
wudi_things 2008-05-21
  • 打赏
  • 举报
回复
property
name="FileName"
type="java.lang.String"
column="FileName"

67,538

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧