Servlet2.5在遇到文件上传时,需要使用request.getInputStream()手动解析或者使用commons-fileupload进行解析,十分麻烦。
而Servlet3.0对上传进行了简化
Servlet代码
package cn.yellowimg.web.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
/**
* Servlet implementation class AServlet
*/
//@MultipartConfig表示开启上传模式
@MultipartConfig
@WebServlet(urlPatterns = "/AServlet")
public class AServlet extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
// request.getParameter()在2.5时遇见上传清况不能使用,而Servlet3.0可以使用
String username = request.getParameter("username");
cout(username);
Part part = request.getPart("resume");
// 获取上传文件类型
cout(part.getContentType());
// 获取字段名
cout(part.getName());
// 得到文件名,不知道为什么没有提供得到文件名这个方法
String header = part.getHeader("Content-Disposition");
int start = header.lastIndexOf("filename=\"") + 10;
int end = header.length() - 1;
String fileName = header.substring(start, end);
// 把上传的文件进行保存
part.write("c://" + fileName);
}
public void cout(String text) {
System.out.println(text);
}
}
表单项代码
<form action="<c:url value='/AServlet'/>" method="post" enctype="multipart/form-data">
用户名:<input type="text" name="username"/><br/>
简 历:<input type="file" name="resume"/><br/>
<input type="submit" value="提交"/>
</form>
总结步骤
- 对Servlet添加
@MultipartConfig
注解 - 在表单项中添加
enctype="multipart/form-data"
- 根据字段名,创建Part对象
Part part = request.getPart("字段名");