因为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();
}
我不想对原来的文件作太大的修改,于是另外建立了一个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();
}
呵呵,我有的网页最多是有4个不同的<form>的,但都不是同一个<javascript>里面先后提交,只是点击不同的按钮提交的。
但这个页面就需要在同一个<javascript>里面先后紧接着提交的。
如果没办法,就只好先提交、保存一般的数据,保存后取得id的值,然后提交有大文件的,和id值一起保存到document数据表里面了。只是这样的话,要对之前写好的代码进行大改了。
不知道对你的适用不适用。
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的运行顺序怎么会混乱了呢?
我感到非常奇怪和困惑,恳请指教,谢谢!!