上传文件的方法就哪几种,但总感觉麻烦一点也不精简,就struts2的方法稍好一点。
下面的方法在之前写的Servlet3.0方法之上进行再次精简,应该是最易懂易用的,但是普通表单域是不能通过req.getParameter来获得(因为二进制流解析),来看看吧~
1.upload.jsp 文件上传表单
<body>
<div class="form" align="center">
<form action="UploadServlet" enctype="multipart/form-data" method="post" >
select:<input type="file" name="file">
param:<input name="param"/><br/>
<input type="submit" value="submit">
</form>
</div>
</body>
2.UploadServlet.java 文件上
@WebServlet("/UploadServlet")
@MultipartConfig
public class UploadServlet extends HttpServlet{
private String filePath; //文件保存路径
private static final long serialVersionUID = 3465909202303185511L;
@Override
public void init(ServletConfig config) throws ServletException {
// TODO Auto-generated method stub
super.init(config);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// TODO Auto-generated method stub
super.doGet(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// 对请求包设置编码
req.setCharacterEncoding("utf-8");
// 告知tomcat如何编码,浏览器如何解码
resp.setContentType("text/html; charset=utf-8");
//获得项目的根目录,并设计文件保存路径
filePath=getServletContext().getRealPath("/image");
// 为了简单,后面也直接就以fileName作为保存文件的名称
SimpleDateFormat dateFormat=new SimpleDateFormat("yyMMddHHmmss");
String fileName=dateFormat.format(new Date())+".jpg";
//获取文件类型和大小
Part part = req.getPart("file");
System.out.println(part.getContentType());
System.out.println(part.getSize());
//获得文本字段,下面方法不可行,只能解析英文和数字,中文即使编码也不行。
String param=req.getParameter("param");
System.out.println("只能中文哦:"+param);
Collection<String> headerNames = part.getHeaderNames();
// 遍历文件上传域的Header Name
for (String headerName : headerNames) {
System.out.println(headerName + "---->" + part.getHeader(headerName));
}
// 将文件保存到项目下的uploads文件夹下,为了简单这里没写判断目录是否存在及创建目录的操作,要先确保该目录已经存在
part.write(filePath + "/" + fileName);
System.out.println("文件保存在:"+filePath+fileName);
req.getRequestDispatcher("/index.jsp").forward(req, resp);
}
}