您的位置:首页 > 其它

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

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");
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: