常用上传组件提交参数的问题
2009-04-07 22:30
197 查看
今天添加了个功能,就是在注册页面增加一个上传用户头像的功能,看似很简单,随便用一个常用组件就能搞定,可实际情况超出想象。开始用的是commoms-fileupload结合commons-io组件,用servlet来实现,部分代码如下:
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
RequestDispatcher rd = null;
// 文件上传
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
try {
List items = upload.parseRequest(request);
Iterator it = items.iterator();
while (it.hasNext()) {
FileItem item = (FileItem) it.next();
if (item.getName() != null && !item.equals("")) {
File tempFile = new File(item.getName());
File file = new File(sc.getRealPath("/") + str, tempFile.getName());
item.write(file);
}
}
} catch (Exception e) {
request.setAttribute(Constants.REGISTER_FAILURE, "注册失败,请重新注册");
rd = request.getRequestDispatcher("/register.jsp");
e.printStackTrace();
}
//提交其他文本域的值
String username = request.getParameter("username");
String password = request.getParameter("password");
String email = request.getParameter("email");
User user = new User();
user.setUsername(username);
user.setPassword(password);
user.setEmail(email);
// System.out.println("test the username : "+username);
// 判断用户名是否已经存在
if (username != null && !username.equals("") && Crud.isExist(username)) {
request.setAttribute(Constants.USERNAME_EXISTENCE,"此用户名已存在,请重新注册一个用户名");
rd = request.getRequestDispatcher("/register.jsp");
} else {
// 是否已经插入到数据库中
if (username != null && !username.equals("") && Crud.insertNewUser(user)) {
request.setAttribute(Constants.REGISTER_SUCCESS,"注册成功,欢迎登陆");
rd = request.getRequestDispatcher("/login.jsp");
} else {
request.setAttribute(Constants.REGISTER_FAILURE,"注册失败,请重新注册");
rd = request.getRequestDispatcher("/register.jsp");
}
}
rd.forward(request, response);
执行完这页代码后,文件能上传到本地服务器指定的文件夹,但插入数据库的那条记录所有字段莫名其妙的显示为null,简单的测试了下,发觉所有获取的其他文本域的值为null,即没有获取到值,原来是因为提交过来的表单的属性设为了enctype="multipart/form-data",但如果把该属性去掉又不能获得上传上类的文件,怎么办?既要获取上传文件又要获取其他文本参数值,用commons-fileupload结合commons-io貌似很难办到,所以舍弃了这个组件,改用jspsmartupload上传组件,很快既获得了上传文件,又获取了其他参数值,不过获取参数值时要稍微有所变化。部分代码如下:
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
RequestDispatcher rd = null;
//smartupload文件上传
SmartUpload su = new SmartUpload();
su.initialize(servletConfig,request,response); //进行初始化
try {
su.upload();
su.save(sc.getRealPath("/")+str); //保存在指定的文件夹
} catch (SmartUploadException e) {
e.printStackTrace();
}
//用jspsmartupload组件的方法取得文本域的值
String username = su.getRequest().getParameter("username");
String password = su.getRequest().getParameter("password");
String email = su.getRequest().getParameter("email");
User user = new User();
user.setUsername(username);
user.setPassword(password);
user.setEmail(email);
// 判断用户名是否已经存在
if (username != null && !username.equals("") && Crud.isExist(username)) {
request.setAttribute(Constants.USERNAME_EXISTENCE,"此用户名已存在,请重新注册一个用户名");
rd = request.getRequestDispatcher("/register.jsp");
} else {
// 是否已经插入到数据库中
if (username!= null && !username.equals("") && Crud.insertNewUser(user)) {
request.setAttribute(Constants.REGISTER_SUCCESS,"注册成功,欢迎登陆");
rd = request.getRequestDispatcher("/login.jsp");
} else {
request.setAttribute(Constants.REGISTER_FAILURE,"注册失败,请重新注册");
rd = request.getRequestDispatcher("/register.jsp");
}
}
rd.forward(request, response);
}
注意获取参数值时是su.getRequest().getParameter("username") ,不是request.getParameter("username");
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
RequestDispatcher rd = null;
// 文件上传
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
try {
List items = upload.parseRequest(request);
Iterator it = items.iterator();
while (it.hasNext()) {
FileItem item = (FileItem) it.next();
if (item.getName() != null && !item.equals("")) {
File tempFile = new File(item.getName());
File file = new File(sc.getRealPath("/") + str, tempFile.getName());
item.write(file);
}
}
} catch (Exception e) {
request.setAttribute(Constants.REGISTER_FAILURE, "注册失败,请重新注册");
rd = request.getRequestDispatcher("/register.jsp");
e.printStackTrace();
}
//提交其他文本域的值
String username = request.getParameter("username");
String password = request.getParameter("password");
String email = request.getParameter("email");
User user = new User();
user.setUsername(username);
user.setPassword(password);
user.setEmail(email);
// System.out.println("test the username : "+username);
// 判断用户名是否已经存在
if (username != null && !username.equals("") && Crud.isExist(username)) {
request.setAttribute(Constants.USERNAME_EXISTENCE,"此用户名已存在,请重新注册一个用户名");
rd = request.getRequestDispatcher("/register.jsp");
} else {
// 是否已经插入到数据库中
if (username != null && !username.equals("") && Crud.insertNewUser(user)) {
request.setAttribute(Constants.REGISTER_SUCCESS,"注册成功,欢迎登陆");
rd = request.getRequestDispatcher("/login.jsp");
} else {
request.setAttribute(Constants.REGISTER_FAILURE,"注册失败,请重新注册");
rd = request.getRequestDispatcher("/register.jsp");
}
}
rd.forward(request, response);
执行完这页代码后,文件能上传到本地服务器指定的文件夹,但插入数据库的那条记录所有字段莫名其妙的显示为null,简单的测试了下,发觉所有获取的其他文本域的值为null,即没有获取到值,原来是因为提交过来的表单的属性设为了enctype="multipart/form-data",但如果把该属性去掉又不能获得上传上类的文件,怎么办?既要获取上传文件又要获取其他文本参数值,用commons-fileupload结合commons-io貌似很难办到,所以舍弃了这个组件,改用jspsmartupload上传组件,很快既获得了上传文件,又获取了其他参数值,不过获取参数值时要稍微有所变化。部分代码如下:
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
RequestDispatcher rd = null;
//smartupload文件上传
SmartUpload su = new SmartUpload();
su.initialize(servletConfig,request,response); //进行初始化
try {
su.upload();
su.save(sc.getRealPath("/")+str); //保存在指定的文件夹
} catch (SmartUploadException e) {
e.printStackTrace();
}
//用jspsmartupload组件的方法取得文本域的值
String username = su.getRequest().getParameter("username");
String password = su.getRequest().getParameter("password");
String email = su.getRequest().getParameter("email");
User user = new User();
user.setUsername(username);
user.setPassword(password);
user.setEmail(email);
// 判断用户名是否已经存在
if (username != null && !username.equals("") && Crud.isExist(username)) {
request.setAttribute(Constants.USERNAME_EXISTENCE,"此用户名已存在,请重新注册一个用户名");
rd = request.getRequestDispatcher("/register.jsp");
} else {
// 是否已经插入到数据库中
if (username!= null && !username.equals("") && Crud.insertNewUser(user)) {
request.setAttribute(Constants.REGISTER_SUCCESS,"注册成功,欢迎登陆");
rd = request.getRequestDispatcher("/login.jsp");
} else {
request.setAttribute(Constants.REGISTER_FAILURE,"注册失败,请重新注册");
rd = request.getRequestDispatcher("/register.jsp");
}
}
rd.forward(request, response);
}
注意获取参数值时是su.getRequest().getParameter("username") ,不是request.getParameter("username");
相关文章推荐
- CURL模拟表单post提交及相关常用参数的使用(包括提交表单同时上传文件)
- ajax上传时参数提交不更新等相关问题
- CURL模拟表单post提交及相关常用参数的使用(包括提交表单同时上传文件)
- 多表单提交 - 再谈JSP使用SmartUpload组件上传的中文问题
- Commons-fileupload组件上传中文文件名乱码问题
- android使用HttpURLConnection上传文件同时提交参数
- jquery 上传组件如何动态绑定参数传递到后台
- 解决Delphi的Indy10组件包TIdHttpServer控件解码HTTP请求时参数乱码的问题
- 2003下,IIS6.0asp无组件上传文件大小限制问题解决办法
- angular的$http.post()提交数据到Java后台接收不到参数值问题的解决方法
- 2003下,asp无组件上传文件大小限制问题
- vue 添加axios组件,解决post传参数为null问题
- 使用<a>标签提交表单数据的问题以及获取session作为函数的参数调用的问题
- retrofit2上传文件参数问题
- GET提交参数乱码问题(apache-tomcat-9.0.0.M19)
- 常用第三方开源上传组件总结
- jsp处理c for循环中取到每一条信息+get方式提交form表单参数拼接问题
- 使用javaScript解决asp.net中mvc使用ajax提交数组参数的匹配问题
- ajax解决参数过长无法提交成功问题