36、上传文件

学习目标:

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>

猜你喜欢

转载自blog.csdn.net/liubao616311/article/details/84072106
36