Servlet3.0以前
在Servlet3.0之前,传统的文件上传都需要借助于common-fileupload,处理起来相对比较复杂。
Servlet3.0之后
在Servlet3.0之后,Servlet3.0API为我们提供了一种更简单的文件上传。
在Servlet3.0中,HttpServletRequest增加 了对文件上传的支持,在HttpServletRequest中提供如下方式来实现文件上传:
首先,通过Part getPart(String name)来获取文件上传域,参数name则是表单中<input type="file">文件域的名字name,同样,还可以通过Collection<Part> getParts()方法来获取所有的文件上传域。
现在,来看看Part这个类中方法:
part.getContentType:通过这个方法我们获取到上传的文件的类型
part.getSize():通过这个方法获取上传的文件的大小
part.getHeaderNames():通过这个方法获取该文件上传域的HeaderName
part.getHeader(String headerName):通过这个方法获取该文件上传域headerName对应的value值
part.write(String path):通过这个方法将文件上传域的文件上传到服务器中path路径下
下面通过一个简单的demo来实例说明:
新建一个index.jsp页面:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="upload" method="post" enctype="multipart/form-data">
<input type="file" id="file" name="file"/>
<input type="submit" value="上传"/>
</form>
</body>
</html>
接下来编写一个UploadServlet,这里我通过注解的方式注册Servlet,需要注意的是,对于处理文件上传的Servlet应该使用@MultipartConfig注解来修饰
@WebServlet(urlPatterns="/upload",name="upload")
@MultipartConfig
public class UploadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out=response.getWriter();
request.setCharacterEncoding("UTF-8");
Part part=request.getPart("file");
out.println(part.getContentType()+" "+part.getSize());
String fileNameInfo=part.getHeader("content-disposition");
String fileName=fileNameInfo.substring(fileNameInfo.indexOf("filename=\""),fileNameInfo.length()-1);
out.println(fileName);
String filename2=fileName.substring(fileName.lastIndexOf("\\"), fileName.length());
part.write(getServletContext().getRealPath("/uploadFiles")
+"/"+filename2);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
servlet中的substring是为了获取到本地上传的文件的文件名,在web项目的根路径下新建一个uploadFiles文件夹,用以存放上上传的文件。使用write方法想服务器中传入文件。