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 请求允许的最大值。
浙公网安备 33010602011771号