今天添加了个功能,就是在注册页面增加一个上传用户头像的功能,看似很简单,随便用一个常用组件就能搞定,可实际情况超出想象。开始用的是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");