1.准备工作,下载apache的IO包和fileupload包,并将它们拷贝到web-inf下的lib目录里面,注意要在WebRoot下建一个upload的目录,用来保存上传的文件
2. 编写类FileUploadServlet
package org.liky.fileupload;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletConfig;
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.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
public class FileUploadServlet extends HttpServlet {
private static final long serialVersionUID = 8088769669368270752L;
// 如果文件的大小超过这个数值,将直接写入磁盘,而不会放在内存缓冲区
private int threshold = 0;
// 服务器端临时文件上传目录
private String repository;
// 单个上传文件大小的最大值
private long fileSizeMax;
@SuppressWarnings("unchecked")
@Override
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
response.setCharacterEncoding("UTF-8");
DiskFileItemFactory factory = new DiskFileItemFactory();
// 设置内存缓冲区的大小
factory.setSizeThreshold(threshold);
// 设置临时文件上传目录
factory.setRepository(new File(repository));
// 创建文件上出的实例
ServletFileUpload upload = new ServletFileUpload(factory);
// 设置单个上传文件大小的最大值
upload.setFileSizeMax(fileSizeMax);
try {
List<FileItem> fileItems = upload.parseRequest(request);
for (FileItem fileItem : fileItems) {
if (fileItem.isFormField()) {
// 获得普通表单项的名字
String name = fileItem.getFieldName();
// 获得普通表单项的值
String value = fileItem.getString();
System.out.println(name + ": " + value);
// 将普通表单项放入request请求中继续向前转发,以进一步处理
request.setAttribute(name, value);
} else {
writeFiles(fileItem, request);
}
}
} catch (FileUploadException e) {
e.printStackTrace();
}
RequestDispatcher formHandler = request
.getRequestDispatcher("/formHandler.do");
if (null != formHandler) {
formHandler.forward(request, response);
System.out.println("****************** FormHandler *****************");
} else {
throw new ServletException("Sorry, formHandler.do not found!");
}
}
@Override
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
/**
* 将文件写入磁盘,注意为了提高效率, 我们没有直接调用FileItem.get()来读取文件内容,
* 因为如果文件非常大的话,网络将承受不了,所以使用了缓冲区来读取, 如果上传的文件很小,则大可以使用这个方法
*
* @param fileItem
*/
@SuppressWarnings("deprecation")
private void writeFiles(FileItem fileItem, HttpServletRequest request)
throws IOException {
// 处理不同的浏览器上传文件时,文件名和路径的问题,有的浏览器只会显示文件名
// 但是有的浏览器却会将完整路径也加上,因此需要处理
String fileNameString = fileItem.getName();
int start = fileNameString.indexOf("//");
String fileName = fileNameString.substring(start + 1);
// 获得当前web应用的根路径
String parent = request.getRealPath(repository);
// 构造一个File对象,规则是当前web应用的根路径加上文件名
File file = new File(parent, fileName);
// 设输出流一个缓冲区
byte[] buffer = new byte[1024];
// 获得实际能够有效读取的字节数组的长度
int length = 0;
// 获得FileItem的文件输入流
InputStream is = fileItem.getInputStream();
// 构造一个文件输出流
FileOutputStream fos = new FileOutputStream(file);
// 将字节流按顺序读入缓冲区,如果已经读到了字节输入流的末尾,
// 也就是length小于或等于0时,读取结束
while ((length = is.read(buffer)) > 0) {
fos.write(buffer, 0, length);
}
// 记得关闭输入和输出流
fos.close();
is.close();
}
/**
* 设置servlet的初始化参数
*/
@Override
public void init(ServletConfig config) throws ServletException {
String thresholdParam = config.getInitParameter("threshold");
String repositoryParam = config.getInitParameter("repository");
String fileSizeMaxParam = config.getInitParameter("fileSizeMax");
if (null != thresholdParam) {
this.threshold = Integer.parseInt(thresholdParam);
}
if (null != repositoryParam) {
this.repository = repositoryParam;
}
if (null != repositoryParam) {
this.fileSizeMax = Integer.parseInt(fileSizeMaxParam);
}
}
}
3.编写类FormHandlerServlet
package org.liky.fileupload;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class FormHandlerServlet extends HttpServlet {
private static final long serialVersionUID = -3433917547449179227L;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
String username = request.getAttribute("username").toString();
String password = request.getAttribute("password").toString();
String ageParam = request.getAttribute("age").toString();
User user = new User();
user.setUsername(username);
user.setPassword(password);
if (null != ageParam) {
user.setAge(Integer.parseInt(ageParam));
}
System.out.println(user.getUsername());
System.out.println(user.getPassword());
System.out.println(user.getAge());
request.setAttribute("user", user);
RequestDispatcher show = request.getRequestDispatcher("show.jsp");
if (null != show) {
show.forward(request, response);
}
else {
response.sendRedirect("/index.jsp");
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request,response);
}
}
4.编写类User
package org.liky.fileupload;
public class User {
private String username;
private String password;
private int age;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
5.文件上传的JSP页面index.jsp
<%@ page language="java" contentType="text/html;charset=UTF-8"%>
<%request.setCharacterEncoding("UTF-8"); %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>上传文件</title>
</head>
<body>
<form action="fileUpload.do" name="FileForm" method="post" enctype="multipart/form-data">
姓名:<input type="text" name="username"><br>
年龄:<input type="text" name="age"><br>
密码:<input type="password" name="password"><br>
文件:<input type="file" name="file"><br>
<input type="submit" value="提交">
</form>
</body>
</html>
6.查看用户信息的JSP页面show.jsp
<%@ page language="java" contentType="text/html;charset=UTF-8"%>
<%@ page import="org.liky.fileupload.User" %>
<%request.setCharacterEncoding("UTF-8");%>
<%
User user = (User)request.getAttribute("user");
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>显示用户信息</title>
</head>
<body>
<h2>显示用户信息</h2>
姓名:<%=user.getUsername()%><br>
密码:<%=user.getPassword()%><br>
年龄:<%=user.getAge()%><br>
</body>
</html>
7.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">
<servlet>
<servlet-name>FileUploadServlet</servlet-name>
<servlet-class>
org.liky.fileupload.FileUploadServlet
</servlet-class>
<init-param>
<!-- 上传文件内存缓冲区的大小,大于这个值将直接写入临时磁盘存储目录 -->
<param-name>threshold</param-name>
<param-value>1048576</param-value>
</init-param>
<init-param>
<!-- 服务器端上传文件的临时磁盘存储目录 -->
<param-name>repository</param-name>
<param-value>/upload</param-value>
</init-param>
<init-param>
<!-- 允许单个上传文件大小的最大值 -->
<param-name>fileSizeMax</param-name>
<param-value>10485760</param-value>
</init-param>
</servlet>
<servlet>
<servlet-name>FormHandlerServlet</servlet-name>
<servlet-class>org.liky.fileupload.FormHandlerServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FileUploadServlet</servlet-name>
<url-pattern>/fileUpload.do</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>FormHandlerServlet</servlet-name>
<url-pattern>/formHandler.do</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>