Servlet3.0提供了对文件上传的原生支持。
使用注解@MultipartConfig将一个Servlet标识为支持文件上传。
Servlet3.0将multipart/form-data的POST请求封装成Part,通过Part对上传的文件进行操作。
上传文件的表单:
<form action="UploadServlet" method="post" enctype="multipart/form-data"> <tr> <td> <input type="file" name="file"><br> <input type="submit"> </td> </tr> </form>
处理文件上传的Servlet:
package com.cndatacom.servlet; import java.io.File; import java.io.IOException; import java.io.PrintWriter; 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; @WebServlet(name="UploadServlet",urlPatterns="/UploadServlet") @MultipartConfig//标识Servlet支持文件上传 public class UploadServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); //存储路径 String storePath = request.getServletContext().getRealPath("/uploadFile"); Part part = request.getPart("file"); //Servlet3没有提供直接获取文件名的方法,需要从请求头中解析出来 //获取请求头 String header = part.getHeader("content-disposition"); //获取文件名 String fileName = parseFileName(header); //把文件写到指定路径 part.write(storePath+File.separator+fileName); PrintWriter out = response.getWriter(); out.println("上传成功"); out.flush(); out.close(); } /** * 根据请求头解析出文件名 * 请求头的格式:form-data; name="file"; filename="a.txt" * @param header * @return */ public String parseFileName(String header) { return header.substring(header.lastIndexOf("=") + 2, header.length() - 1); } }
@MultipartConfig的属性都是可选的:
fileSizeThreshold:设置阈值,达到阈值后开始把文件写到磁盘。
location: 设置文件的存储目录。
maxFileSize: 允许上传文件的最大值,Byte为单位。
maxRequestSize: multipart/form-data 请求允许的最大值。