您的位置:首页 > 运维架构 > 网站架构

【网站编程技巧】一种十分简单高效的文本表单和文件一起提交的方法

2013-05-09 13:26 302 查看
<form action="uploadSourceFile.do"enctype="multipart/form-data" method="post" />
<input type="file" name="file" accept="application/msword"/>
<input type="submit" value="上传" style="width:200px; border:1px solid #580000"></td>
</form>
以上代码是写在页面里的一个提交word文档的表单。为了说明此表单提交的是文件数据,我们使用了
enctype="multipart/form-data"

,但是设置了此项之后,如果我们将无法同时提交其他表单数据,比如有时候我们想把上传时候的当前用户名也传送给后台。

【网上的解决方案】

1. 用JS单击一个提交按钮,提交两个表单。      PS:我不知道这些人有没有测试,我是测试了,此方案无效,用JS提交,成功的只有最后一个。

比如: 把 document.form1.submit(); 和document.form2.submit()放在一起,只有form2会提交成功。(MYECLIPSE+JSP+TOMCAT6.0+CHROME)

2. 把enctype改成普通数据,然后在后台一个个的读取出来,分析,如果是文本数据就分解字符串获取出来,如果是文件就用文件类型读取出来。

我不知道enctype改成普通数据后,是否能提交文件,我用的DiskFileUpload这个类来后台处理的,是显示没有文件数据。网上有些代码,据说可以,但也十分复杂。我没测试。

因为我找到了另一个十分简单高效的方法。

【我的解决方案】

仔细看上面的那个表单,我们发现这个文件选择输入框有个属性叫做name,经过测试,这个name将会被一起提交到后台。而且这是个字符串,最好的要获取它十分方便,用fileItem.getFieldName()即可。

由于就一个字段,所以不加处理的话,一个表单只能提交一个字符串数据。为了支持多个文本数据同时提交。只需要把你的表单文本数据顺序的按照以下方法连接起来。

比如现有"hello world", "I love you", "Yes I will" 三个字符串数据。

只需要这样连接成一个字符串,两两之间用"="号连接即可:"hello world=I love you=Yes I will"

然后在后台,只需要用一个函数tang_Form就可以轻松获得每个字段的值。

【代码实例】

JSP/HTML 页面端:

<form action="uploadSourceFile.do"enctype="multipart/form-data" method="post" />
<input type="file" name="hello world=I love you=Yes I will" accept="application/msword"/>
<input type="submit" value="上传" style="width:200px; border:1px solid #580000"></td>
</form>


后台Java处理:

DiskFileUpload fileUpload = new DiskFileUpload();
List list = fileUpload.parseRequest(request);
Iterator iterator = list.iterator();
if(iterator.hasNext())
{
FileItem fileItem = (FileItem)iterator.next();//文件对象
String [] tang_form=FlowService.tang_Form(fileItem.getFieldName());//获取文件表单里的字段名
String helloworld=tang_form[0];//第一个表单文本数据
String iloveu=tang_form[1]; //第二个表单文本数据
String yesiwill=tang_form[2];//第三个表单文本数据



其中tang_Form 是我自己写的,支持动态数目的字段,你只要用=号连接就行,不需要告诉函数多少个字段。 以下是函数代码:

public static String [] tang_Form(String src_str)
{//注意此方法传入的form表单数据里不能有 = 号;
int field_num=0;//自动统计字段数目
for(int i=0;i<src_str.length();i++)
{
if(src_str.charAt(i)=='=')
{
field_num++;
}
}
field_num++;
String [] re_list=new String[field_num];
int  field_num_point=0;//计数器指针
String temp="";
for(int i=0;i<src_str.length();i++)
{
if(src_str.charAt(i)=='=')
{
re_list[field_num_point]=temp;
temp="";
field_num_point++;
}
else
{
temp=temp+src_str.charAt(i);
}
}
re_list[field_num_point]=temp;
return  re_list;
}
当然您也可以自己写一个哦 ^_^
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐