准备工作
1.使用Maven下载commons-fileupload组件和commons-io依赖(也可直接导入jar包)。
commons-fileupload:
<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
commons-io:
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
2.配置Servlet的web.xml文件,添加如下代码:
<servlet>
<servlet-name>UpLoadServlet</servlet-name>
<servlet-class>servlet.UpLoadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UpLoadServlet</servlet-name>
<url-pattern>/uploadServlet.do</url-pattern>
</servlet-mapping>
创建upload.jsp文件
制作用于上传文件的jsp界面。其中上传文件必须为post请求,因为get请求有上传大小的限制。同时form标签中必须要有enctype="multipart/form-data"字段,表明此表单拥有上传文件的功能。
代码如下:
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="uploadServlet.do" method="post" enctype="multipart/form-data">
请输入用户名:
<input type="text" name="username">
<br>
请输入密码:
<input type="password" name="password">
<br>
<input type="file" name="spicture">
<input type="submit" value="上传">
</form>
</body>
</html>
创建类UpLoadServlet.java
此类继承HttpServlet,重写了doPost和doGet方法,在获取jsp页面的值时,因为form标签中有enctype=“multipart/form-data”,表明此表单中不只有普通的字段,还有文件类型的字段,所以不能使用request.getParameter()方法来获取值,必须通过FileItem获取。
public class UpLoadServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse respone) throws ServletException, IOException {
//处理乱码
request.setCharacterEncoding("utf-8");
respone.setCharacterEncoding("utf-8");
respone.setContentType("text/html;charset=UTF-8");
boolean isMulti = ServletFileUpload.isMultipartContent(request);
//检测form标签中有没有enctype="multipart/form-data"字段
if(isMulti) {
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
try {
//通过parseRequest解析form中所有字段并保存至items集合
List<FileItem> items = upload.parseRequest(request);
//迭代器遍历items集合
Iterator<FileItem> iter = items.iterator();
while(iter.hasNext()) {
FileItem item = iter.next();
String s = item.getFieldName();
//判断前台字段是普通form表单字段(username、password)还是文件字段(spicture)
if(item.isFormField()) {
//根据getFieldName获取的属性判断item是username、password或spicture
if(s.equals("username")) {
//从item以指定编码格式获取值
String username = item.getString("UTF-8");
}
else if(s.equals("password")) {
String password = item.getString("UTF-8");
}
else {
System.out.println("其他字段");
}
}
else {
//文件上传
//获取文件名
String fileName = item.getName();
//获取服务器路径(位于tomcat的upload文件夹)
String path = request.getSession().getServletContext().getRealPath("upload");
//获取文件内容并上传
File file = new File(path,fileName);
item.write(file);
System.out.println(fileName + "上传成功");
return;
}
}
} catch (FileUploadException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}