学习目标:
1、掌握文件上传的方法
2、为什么要学习Java语言
学习过程:
这节课讲解一些如何上传文件,这里我们为用户表添加一个头像属性
一、修改数据库表
首先我们要保存用户上传文件的信息,所有要修改数据库,但是我们不是使用数据库保存文件的,文件保存在web服务器的目录下,数据库只是保存文件的路径就可以了,所以我们在tb_user表中添加一个新的属性header,使用varchar格式就可以了,同时修改UserDao的代码,这些代码比较简单,这里就不列出来了。
二、修改页面
这里我们可以使用html的input控件,type类型为file就可以了,同时表单的method方法必须是post,还需要修改enctype属性值为:"multipart/form-data"。这是必须的,adduser.jsp页面代码如下:
<form action="admin/userServlet?op=add" method="post"
enctype="multipart/form-data">
用户名:<input name="username" /> <br /> 密码:<input name="pass"
type="password" /> <br /> 性别:<input type="radio" value="1"
name="sex" checked="checked" />男 <input type="radio" value="0"
name="sex" />女 <br /> 头像:<input type="file" name="header" /> <br />
<input type="submit" value="注册" />
</form>
三、在程序中实现上传功能
1、导入第三方包
实现文件上传有很多种方式,这里我们使用第三方commons-fileupload,你可以到网上下载这个包,这个只有一个核心包,不过它需要依赖commons-io包,所有我们导入这两个包就可以了。
commons-fileupload.jar
commons-io.jar
2、打开示例程序,参考示例程序完成代码
java的第三方包支持的技术很多,这也是java流行的原因,而且文档也非常详细,我们可以在这个包的site目录下,找到index.html文件,并打开就可以看到非常详细的文档了,进入文档,点击User Guide就有一个非常详细的入门示例,你可以参考这个示例完成文件的上传操作。
打开servlet修改添加用户的操作,完成代码如下:
else if (op.equals("add")) {
Map<String, String> data = new HashMap<String, String>();
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
String savefilename = null;
try {
if (isMultipart) {
// Create a factory for disk-based file items
FileItemFactory factory = new DiskFileItemFactory();
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);
// Parse the request
List<FileItem> items = upload.parseRequest(request);
// Process the uploaded items
Iterator iter = items.iterator();
while (iter.hasNext()) {
FileItem item = (FileItem) iter.next();
if (item.isFormField()) {
// processFormField(item);
// 处理原来原始的表单
String name = item.getFieldName();
String value = item.getString();
data.put(name, value);
} else {
// processUploadedFile(item);
// 处理上传文件
String fieldName = item.getFieldName();
String fileName = item.getName();
String contentType = item.getContentType();
boolean isInMemory = item.isInMemory();
long sizeInBytes = item.getSize();
// System.out.println(fieldName+":"+fileName+":"+contentType+":"+isInMemory+":"+sizeInBytes);
// 图片上传
// 如何获得服务器的文件路径
String strDirPath = request.getSession()
.getServletContext().getRealPath("/header");
savefilename = UUID.randomUUID()
+ fileName.substring(fileName
.lastIndexOf("."));
File uploadedFile = new File(strDirPath + "//"
+ savefilename);
item.write(uploadedFile);
}
}
// 保存在数据库中
User user = new User();
user.setUsername(data.get("username"));
user.setPass(data.get("pass"));
user.setSex(Integer.parseInt(data.get("sex")));
user.setHeader(savefilename);
int result = userDao.addUser(user);
if (result > 0) {
response.sendRedirect("userServlet?op=list");
} else {
response.sendRedirect("error.jsp");
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
从上面的代码可以看到对于普通控件和文件控件是分开处理的,普通控件的值我们定义了一个Map格式全部保存起来,文件控件我们就保存在服务器的header目录下,这里需要动态的获得服务器的路径使用的方法是:
String strDirPath = request.getSession().getServletContext().getRealPath("/header");
为了保证上传图片的文件名的唯一性,这里我们使用UUID生成一个唯一性的名称,代码是:
UUID.randomUUID()
这样功能就完成了,你可以尝试上传一下,然后去tomcat服务器的header目录下就可以见到这个文件了。
四、在列表中显示头像
我们要子列表中显示头像,因为数据库中只是保存了文件名称,所有我们需要自己写书路径了,既然是头像,我们当然需要使用img控件显示图片了。代码如下:
<td><img alt="" src="header/${user.header }" width="50"
height="50"></td>