因为JSP和Servlet、biz文件已经写好并运行了一段时间了,现在根据领导需要,要把网页上提交的数据的扫描件作为附件也提交到数据库(mssql server 2000)。
我不想对原来的文件作太大的修改,于是另外建立了一个document数据表。表结构如下:
create table document
(
sn  int primary key identity(1,1) not null,
tableName varchar(15) not null,
snInTable int not null,
docName varchar(127) not null,
showName varchar(127) not null, 
document image not null,
)
然后,建立一个document的实体类,在页面原来的提交数据内容的form(表单名:form1)外面,再加一个提交大文件的form(表单名:form2)。<form>也多了一个参数:enctype="multipart/form-data"。
增加这些页面代码之前,我特意做了一个测试,就是用javascript来提交多个form。代码如下:
<javascript>form1.submit();form2.submit();</javascript>
就可以提交两个表单。但必须是提交到两个不同的Servlet文件。
测试通过之后,我就把页面的表单提交的javascript也写好了,只是,是先提交了有大文件的表单form2,然后提交数据内容的form1。因为我理所当然地认为,提交不应该有先后之分。
于是,我在Servlet这样设计的:
1、把文件form提交到服务器,文件放在一个临时目录里面。
2、把tableName、docName和showName放到一个实例化后的document对象里面,然后放入session。
3、提交数据内容的form,并在session里读取document对象,并作为参数通过biz保存数据。
4、保存数据成功后取得snInTable,就把大文件,及大文件的相关属性参数也保存到数据库。现在的问题是:在提交大文件的时候,已经失败了。
原来,我后来才测试出来,提交两个表单的时候,有enctype="multipart/form-data"的表单,必须放在普通表单的后面来提交。
请问是这样吗?有没有什么办法可以先提交有大文件的那个form,然后再提交普通的form?因为我已经写好了servlet和biz,不想再大改了。还有一个问题,不知道在什么情况下,接收文件的Servlet,会在运行到su.upload()的时候停下来,打开任务管理器,发现CPU使用率达到50%甚至100%。达到50%的时候,计算机还可以继续运行,达到100%的时候,计算机就停下来了,再看“进程”,发现javaw的CPU使用率达到99%。停掉tomcat服务器就回到正常状态了。请问这是什么原因呢?怎么解决?
附Servlet的代码: String fileName="";
SmartUpload su = new SmartUpload();
//su.initialize(pageContext); 原来的代码
su.initialize(this.getServletConfig(), request, response); //必须被初始化
long ds=200000;
try{
     // 接收上传的文件
su.upload();
// 利用Request对象获取参数之值。这个docSize是从页面传过来的文本字符串
String docSize=su.getRequest().getParameter("docSize");
if (NoHarm.isNumber(docSize, 1))
ds=Long.parseLong(docSize);
//限制每个上传文件的最大长度。限制不同级别上传文件的大小
     su.setMaxFileSize(ds);
// 将上传文件全部保存到指定目录
int count = su.save("/File"); //此语句可同时把几个文件放在指定的目录
System.out.println(count+"个文件上传成功!");
com.jspsmart.upload.File file = su.getFiles().getFile(0);
if (!file.isMissing()){
fileName=file.getFileName();
System.out.print("文件名(getFileName()):"+fileName);
System.out.print(",文件长度(getSize()):" +file.getSize());
     System.out.print(",\n文件扩展名(getFileExt()):"+file.getFileExt());
     System.out.println(",文件全名(FilePathName()):"+file.getFilePathName());
     Document doc=new Document();
     doc.setShowName(fileName);
     String tmp=NoHarm.noHarm(su.getRequest().getParameter("tableName"));
     doc.setTableName(tmp);
     String legalStr="0123456789abcdefghijklmnopqrstuvwxyz" +
     "ABCDEFGHIJKLMNOPQRSTUVWXYZ `~!@#$%^&()_-+={}[];',.";
     for (byte i=0;i<fileName.length();i++){
     //如果包含了汉字等特殊字符,为了保证能正常显示文件,必须把文件名改为表名+表中的sn
     if (legalStr.indexOf(fileName.charAt(i))==-1){
     fileName=tmp+"."+file.getFileExt();
     break;
     }
     }
     doc.setDocName(fileName);
     tmp=su.getRequest().getParameter("sesName"); //以防有同名的session相冲突
     System.out.println("取得的表名和文件名= "+doc.getTableName()+","+doc.getDocName());
     tmp=tmp==null?"":tmp;
     session.setAttribute("doc"+tmp, doc);
     /*以下为测试代码:*/
     doc.setSnInTable(100);
     message+=biz.DocumentBiz.documentInsert(doc, op)?"操作成功!":"操作失败!";
}else
message+="文件不存在!";
}catch(Exception e){
e.printStackTrace();
if (e.getMessage().indexOf("Size exceeded for this file")>-1)
message+="原因:上传的文件太大,超过"+ds+"字节了。";
else
message+="操作失败!"+e.getMessage();
}

解决方案 »

  1.   

    不可以的,一个页面只能出现一对form标签,你可以提交至一个方法里,而这个方法调用你写好的那两个方法
      

  2.   

    我回复晚了6分钟,原来已经有网友回复了。
    呵呵,我有的网页最多是有4个不同的<form>的,但都不是同一个<javascript>里面先后提交,只是点击不同的按钮提交的。
    但这个页面就需要在同一个<javascript>里面先后紧接着提交的。
    如果没办法,就只好先提交、保存一般的数据,保存后取得id的值,然后提交有大文件的,和id值一起保存到document数据表里面了。只是这样的话,要对之前写好的代码进行大改了。
      

  3.   

    这个问题在我们公司上一个项目遇到过,我是用了一个FANCY框架来上传文档的,提交文件之后把文件保存了把文件名,路径放到Session,然后发送一个AJAX请求来提交另一份表单,然后匹配文件名,保存对象。
    不知道对你的适用不适用。
      

  4.   

    哦,这个框架和我现在的做法差不多。现在把原来先提交大文件的form,再提交普通的<form>改为,先提交普通的<form>,保存后取得id号,放到Session,再提交大文件的<form>。
      

  5.   

    把两个form合成一个form传到后台,后台再把这个form拆成2个vo,然后再其他操作
      

  6.   

    方法是一樣的 只需要保存完一個FORM后,調用一個call方法,來繼續提交就可以了。祝你好運!
      

  7.   

    回6楼,如果用你的方法,我要修改的代码就太多了,因为我之前已经写好了一大堆提交普通<form>的代码了。请教7楼,请问call方法应该怎么写呢?因为我现在用的是在<javascript>里面提交的,先提交普通的form,紧接着提交大文件的<form>。
      

  8.   

    一个星期前发贴请教,后来自己解决了。没想到运行正常后,过了几天,不知道动了哪里,又出问题了。提交表单的JS代码如下:alert("在这里1");          //1,一般的form,有很多表单域
    form1.submit();           //2
    alert("在这里2");          //3
    form3.submit();           //4,一个多余的,用于分隔form1和form2的表单,只有一个隐藏域<input type="hidden">
    if (form2.doc.value!=""){
    form2.submit();    //5,含有<input type=file>的,用于提交大文件的表单
    出问题之前是没有第1、3、4句代码的。而现在如果没有这几句,根本不能正常提交。
    而令我深感迷惑的是,为什么可以提交form3,却不能提交form1呢?
    如果第1、3句,根本不提交form1,就是说不运行第2句。请问这是什么原因呢?为什么alert有那么大的作用?
    后来问了一下同学,同学也说不清是什么原因,可能是同步的原因吧???!!!后来同学又建议我把提交form2的语句写到另一个方法,于是现在代码变为:function submitForm(){
    //alert("在这里1"); //1
    form1.submit(); //2
    //alert("在这里2"); //3
    form3.submit(); //4
    submitForm2(); //不知道为何,总是不能按顺序提交form2被迫加上这个多余的function 
    }function submitForm2(){
    if (form2.doc.value!=""){
    //alert("文件名:"+form2.doc.value);
    form2.submit();
    }
    } 现在就可以正常提交form1和form2了。
    但还是很奇怪,form1提交了之后,Servlet里面运行了开头之后,却去提交form3,运行完form3的Servlet之后,再运行form1的Servlet余下的代码。怎么会这样呢?
    而如果把第4句代码屏蔽掉,那个form1的Servlet还没运行完的,怎么就运行submitForm2()呢?
    js和jsp和Servlet的运行顺序怎么会混乱了呢?
    我感到非常奇怪和困惑,恳请指教,谢谢!!