使用Servlet进行文件上传操作
???? 使用Servlet做文件上传,当然,底层的工作还是有开源的框架,即便如此,也着实耗费了我一些功夫。下面开始进行讲解,文件上传功能是Java在Web应用中常用的功能之一,也是程序员必回的一项技能。
??? 首先,我要使用到apache的一个开源jar包,为file-upload.jar,这个jar包封装了对用户上传的文件的操作,同时该jar包需要依赖common-io.jar,commons-io.jar封装了一些对文件底层的操作,具体原理我也没有研究,有兴趣的自己去apache官方下载研究。
??? 再说下文件上传需要的java类,主要使用到了org.apache.commons.fileupload.disk包中的DiskFileItemFactory类(主要供实例化文件上传高层API实例化使用)和DiskFileItem类(判断表单中的提交的元素是否为文件类型,若是,则进行写入到磁盘操作(需要程序员手动去写))。
??? 首先,开始进行实际操作,新建一个web工程,工程目录结构如下图所示:

??? 第一步,写界面:fileUpload.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
? <head>
??? <title>fileUpload</title>
? </head>
?
? <body>
??? <h3>文件上传Demo</h3>
??? <form action="fileUploadloadServlet" method="post" enctype="multipart/form-data">
??? ?名字:<input type="text" name="name"><br>
??? ?file1:<input type="file" name="file1"><br>
??? ?file2:<input type="file" name="file2"><br/>
??? ?<input type="submit" value="提交">
??? </form>
?
fileUploadSucces.jsp:
<%@ page language="java" import="java.util.*" isELIgnored="false" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
? <head>
??? <title>文件上传成功</title>
? </head>??
? <body>
??? 名字:${requestScope.name }<br/>
??? file1:${requestScope.file1 }<br/>
??? file2:${requestScope.file2 }????
? </body>
</html>
? </body>
</html>
第二步:新建一个Servlet,名字为FileUploadloadServlet.java,代码如下
import java.io.File;
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
/**
?* 使用Servlet进行文件上传Demo
?*
?* @author XiaoYun 2013-07-22
?*/
public class FileUploadloadServlet extends HttpServlet {
?/**
? *
? */
?private static final long serialVersionUID = 2818543291976552632L;
?@Override
?protected void doPost(HttpServletRequest req, HttpServletResponse resp)
???throws ServletException, IOException {
??req.setCharacterEncoding("UTF-8");
??resp.setContentType("text/html;charset=utf-8");
??String path = this.getServletConfig().getServletContext().getRealPath("/upload");
??System.out.println(path);
??// 创建磁盘文件工厂
??DiskFileItemFactory factory = new DiskFileItemFactory();
??
??// 设置超出文件默认大小后文件存放在硬盘上的位置
??factory.setRepository(new File(path));??
??
??// 实例化封装文件上传的高层API
??ServletFileUpload upload = new ServletFileUpload(factory);
??
??try {
???// 从request中获取文件
???List<FileItem> items = upload.parseRequest(req);
???for (FileItem fileItem : items) {
???? // 获取输入框或表单的名字
?????String name = fileItem.getFieldName();
????if (fileItem.isFormField()) { // 判断是否是为简单的表单类型
?????String value = fileItem.getString();??????????
?????req.setAttribute(name, value);
????} else { // 是文件类型
?????// 同时可以进行多文件上传
?????// 获取上传的文件名
?????String fileName = fileItem.getName();
?????fileName = fileName.substring(fileName.indexOf("\\") + 1);
?????req.setAttribute(name, fileName);
?????fileItem.write(new File(path, fileName));
????}
???}
???req.getRequestDispatcher("fileUploadSuccess.jsp").forward(req, resp);
??} catch (Exception e) {
???e.printStackTrace();
??}
?}
}
第三部:编写配置文件web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
?xmlns="http://java.sun.com/xml/ns/javaee"
?xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
?xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
?http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
? <welcome-file-list>
??? <welcome-file>index.jsp</welcome-file>
? </welcome-file-list>
? <servlet>
??? <servlet-name>FileUploadloadServlet</servlet-name>
??? <servlet-class>com.servlet.upload.FileUploadloadServlet</servlet-class>
? </servlet>
? <servlet-mapping>
??? <servlet-name>FileUploadloadServlet</servlet-name>
??? <url-pattern>/fileUploadloadServlet</url-pattern>
? </servlet-mapping>
</web-app>
第四步,也是很多人都容易忽略的一步(如果你想把文件上传到当前工程的目录下的话),系统默认是上传到tomcat的部署工程目录下。? 打开tomcat安装目录\conf\server.xml,在</Host>前面加上<Context path="/fileUpload(你的工程名字)" docBase="D:\Workspaces\study\fileUpload\WebRoot(你的WebRoot目录的绝对路径)" reloadable="true"/>
????? </Host>
??? 好,这样一个Demo就写完了,启动tomcat(我的版本是5.5),就可以进行文件操作了,在我机器上试过了,可以跑通没有问题。
??? 通过这样一个例子,总结下文件上传在servlet中的处理过程:
??? 1. 实例化文件条目工厂? DiskFileItemFactory factory = new DiskFileItemFactory();
??? 2. 实例化封装文件上传方法的高层API, ServletFileUpload upload = new ServletFileUpload(factory);
??? 3. 获取要上传的位置path(这时候会通过server.xml读取配置文件);
????4. 高层API对request进行解析,得到List<FileItem> list集合;
??? 5. 迭代list,使用item.isFormField()方法判断该item是否问文件,如果是,则使用item.write(new File(path,fileName)),写入到指定目录。
?
? 好,使用servlet进行文件上传的大致流程就是如此。 如果你有任何疑问或者认为我有理解的不太的地方,欢迎各位同行批评指正,谢谢。
?
?