常用上传组件提交参数的问题

来源:互联网 发布:周立功单片机有限公司 编辑:程序博客网 时间:2024/05/29 16:25

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