同时提交文件表单和普通表单的问题

下一行code 2011-12-01 11:07:10
提文件表单需要添加ENCTYPE="multipart/form-data"属性,这样才可以实现文件上传功能,但是这样做了以后在Servlet中就获取不到普通表单中数据了,上网查了很多,说可以通过循环迭代获取,但是总是遇到些问题,在这里请高手给个简单的例子,可以获取文件表单和普通表单的例子。

// 判断enctype属性是否为multipart/form-data
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
if(isMultipart){
//下面这两行构造文件上传处理对象
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
Iterator items;
try {
//下面这行解析表单提交的所有文件内容
items = upload.parseRequest(request).iterator();
while (items.hasNext()) {
FileItem item = (FileItem) items.next();
if (!item.isFormField()) {
//下面这段代码取出文件名,和服务器的存储路径,上传的文件将被存储在当前项目的file文件夹
String name = item.getName();
String fileName = name.substring(name.lastIndexOf('\\') + 1, name.length());
String path = request.getRealPath("file")+ File.separatorChar + fileName;
// 上传文件
File uploadedFile = new File(path);
item.write(uploadedFile);
U_usermessage_zhaopian=path;//为照片赋值!!
System.out.println("照片路径:"+path);
}else{
int id=GetID.GetID()+1;//定义id变量,次数据在插入数据库时有系统计算生成
System.out.println("获取到ID为"+id);
String U_usermessage_xingming=item.getString("U_usermessage_xingming");//获取姓名 String U_usermessage_fadongjihao=item.getString("U_usermessage_fadongjihao");//获取发动机号
String U_usermessage_chehao=item.getString("U_usermessage_chehao");//获取车号
String U_usermessage_pinpaixinghao=item.getString("U_usermessage_pinpaixinghao");//获取品牌型号
//由于日期需要转换,将所有日期放在一个try,catche里面处理缩小代码块
Date U_usermessage_nianshenriqi = null;//获取年审日期
Date U_usermessage_erbaoriqi = null;//获取二保日期
Date U_usermessage_yunyingzhengriqi= null;//获取运营证日期
Date U_usermessage_baoxianriqi= null;//获取保险日期
Date U_usermessage_luohuriqi= null;//获取落户日期
Date U_usermessage_zhuceriqi= null;//获取注册日期
Date U_usermessage_shangyexianshijian= null;//获取商业保险日期
try {
//获取年审日期
U_usermessage_nianshenriqi = DateFormat.getDateInstance().parse(item.getString("U_usermessage_nianshenriqi"));
//获取二保日期
U_usermessage_erbaoriqi=DateFormat.getDateInstance().parse(item.getString("U_usermessage_erbaoriqi"));
//获取运营证日期
U_usermessage_yunyingzhengriqi=DateFormat.getDateInstance().parse(item.getString("U_usermessage_yunyingzhengriqi"));
//获取保险日期
U_usermessage_baoxianriqi=DateFormat.getDateInstance().parse(item.getString("U_usermessage_baoxianriqi"));
//获取落户日期
U_usermessage_luohuriqi=DateFormat.getDateInstance().parse(item.getString("U_usermessage_luohuriqi"));
//获取注册日期
U_usermessage_zhuceriqi=DateFormat.getDateInstance().parse(item.getString("U_usermessage_zhuceriqi"));
//获取商业保险日期
U_usermessage_shangyexianshijian=DateFormat.getDateInstance().parse(item.getString("U_usermessage_shangyexianshijian"));
} catch (ParseException e) {
// TODO Auto-generated catch block
System.out.println("时间转换出问题!!");
e.printStackTrace();
}
//获取运营证号
String U_usermessage_yunyingzhenghao=item.getString("U_usermessage_yunyingzhenghao");
//获取保单号码
String U_usermessage_baodianhao=item.getString("U_usermessage_baodianhao");
//获取手机号码
String U_usermessage_shouji=item.getString("U_usermessage_shouji");
//获取车架号码
String U_usermessage_chejiahao=item.getString("U_usermessage_chejiahao");
//获取固定电话号码
String U_usermessage_gudingdianhua=item.getString("U_usermessage_gudingdianhua");
//获取保险金额,被进行强制转换
Double U_usermessage_baoxianjine=(Double.parseDouble(item.getString("U_usermessage_baoxianjine")));
//获取商业限金额,进行强制转换
Double U_usermessage_shangyexianjine=(Double.parseDouble(item.getString("U_usermessage_shangyexianjine")));
//获取备注文本
String beizhu=item.getString("beizhu");

大概获取的数据就这么多,后面还需要使用Hibernate将数据插入数据库,这倒是没什么问题,就是我现在只可以获取到ID.报错如下:
请求进入服务器函数!TestServlet
开始初始化变量!
开始加载默认的配置文件hibernate.cfg.xml
log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment).
log4j:WARN Please initialize the log4j system properly.
正在创建sessionfactory
开始事务!
Hibernate: select * from uusermassage-----我的ID是从数据库中获取最后一条数据ID+1的方式,上面第24行代码就是
获取到的ID为1
获取到的ID为4
获取到的ID为5
获取到的ID为6
获取到的ID为8
获取到的ID为9
获取到的ID为10
获取到的ID为11
获取到的ID为12
获取到的ID为13
获取到的ID为14
获取到的ID为15
获取到的ID为16
获取到的ID为17
获取到的ID为18
获取到的ID为19
获取到的ID为20
获取到的ID为21
获取到ID为22
java.io.UnsupportedEncodingException: U_usermessage_xingming
at java.lang.StringCoding.decode(Unknown Source)
at java.lang.String.<init>(Unknown Source)
at java.lang.String.<init>(Unknown Source)
at org.apache.commons.fileupload.disk.DiskFileItem.getString(DiskFileItem.java:375)
at com.servlet.TestServlet.service(TestServlet.java:84)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at com.servlet.EncodingFilter.doFilter(EncodingFilter.java:35)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:242)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:203)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:108)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:379)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:242)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:259)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:237)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:281)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
...全文
687 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
luckyc2008 2011-12-02
  • 打赏
  • 举报
回复
http://blog.csdn.net/lian_zhihui1984/article/details/6822201看看这个还能帮到你。
dracularking 2011-12-02
  • 打赏
  • 举报
回复
报的就是不支持这个encoding U_usermessage_xingming
下一行code 2011-12-02
  • 打赏
  • 举报
回复
研究了一天,我自己终于搞定了!下面把我的解决方法贴出来分享!
JSP页面:send.jsp,页面编码为GBK

<body>
<%!
Date now=new Date();
String form=String.format("%tF",now);
%>
<form action="Uploadfile" method="post" enctype="multipart/form-data">
<p>上传的文件是:(文件大小不要超过2MB)<br>
<input type="file" name="file" size="80"/><br/>
<p>文件描述
<input type="text" name="upDe" size="80"/><br>
<p>上传时间
<input type="text" name="uptime" size="80"/><br/>
<input type="submit" value="提交"/>
</form>
</body>

我的servlet方法,Uploadfile.java

package com.servlet;


import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

public class Uploadfile extends HttpServlet {
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
PrintWriter out = response.getWriter();
String uploadPath=this.getServletContext().getRealPath("/file");
String message=null,content=null,dtme=null;
try{
if(ServletFileUpload.isMultipartContent(request)){ //判断获取的是不是文件
DiskFileItemFactory disk=new DiskFileItemFactory();
disk.setSizeThreshold(20*1024); //设置内存可存字节数
disk.setRepository(disk.getRepository()); //设置临时文件目录
ServletFileUpload up=new ServletFileUpload(disk);
int maxsize=2*1024*1024;
List list=up.parseRequest(request); //获取上传列表
Iterator i=list.iterator(); //创建列表的迭代器
while(i.hasNext()){
FileItem fm=(FileItem)i.next();//遍历列表
if(!fm.isFormField()){
String filePath=fm.getName(); //获取文件全路径名
String fileName="";
int startIndex=filePath.lastIndexOf("\\");
if(startIndex!=-1){ //对文件名进行截取
fileName=filePath.substring(startIndex+1);
}else{
fileName=filePath;
}
if(fm.getSize()>maxsize){
message="文件太大了,不要超过2MB";
break;
}
String fileSize=new Long(fm.getSize()).toString();
if((fileName==null)||fileName.equals("")&&(fileSize.equals("0"))){
message="文件名不能为空,文件大小也不能为零!";
break;
}
File saveFile=new File(uploadPath,fileName);
fm.write(saveFile);//向文件中写入数据
message="文件上传成功!";

}else{
String foename=fm.getFieldName();//获取表单元素名
String con=fm.getString("GBK");
//表单元素
if(foename.equals("upDe")){
content=con;
}else if(foename.equals("uptime")){
dtme=con;
}
}
}

}
}catch(Exception ex){
ex.printStackTrace();

}
request.setAttribute("result", message);
request.setAttribute("upDe", content);
request.setAttribute("dtme", dtme);
request.getRequestDispatcher("message.jsp").forward(request, response);
}
}


message.jsp

<body>
<table border=1>
<tr>
<td>上传情况:</td>
<td><%=request.getAttribute("result") %></td>
</tr>
<tr>
<td>上传情况:</td>
<td><%=request.getAttribute("upDe") %></td>
</tr>
<tr>
<td>上传时间:</td>
<td><%=request.getAttribute("dtme") %></td>
</tr>
</table>

我上传文件是通过commons-fileUpload组件,当然用到的组件是commons-fileupload-1.2.2.jar和commons-io-2.1.jar这个两个包,然后通过上面的方法就可以解决普通表单和文件表单同时提交的问题了,对于FileItem对象的getString()方法有两种重载方式:第一种是无参的,编码方式系统默认的;第二种是有参的,参数就是定义的编码方式,如UTF-8,GBK等。为了避免获取请求数据时出现中文乱码,可以应用设置编码格式的getString()方法。
下一行code 2011-12-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 dracularking 的回复:]

java.io.UnsupportedEncodingException: U_usermessage_xingming

U_usermessage_xingming这个难道是encoding name?
[/Quote]
对啊,是的,下面的都是啊
dracularking 2011-12-01
  • 打赏
  • 举报
回复
java.io.UnsupportedEncodingException: U_usermessage_xingming

U_usermessage_xingming这个难道是encoding name?
下一行code 2011-12-01
  • 打赏
  • 举报
回复
沉了,UP!UP!!

67,512

社区成员

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

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