1.创建jsp页面 表单和文件上传元素 声明表单属性 enctype="mulitiper/form-data"
2.创建servlet 声明注解@MultipartConfig 表示此servlet支持文件上传
3.声明路径:req.getSession().getServletContext().getRealPath("upload/");服务器文件系统上的绝对路径
4.对路径进行判断 不过不存在 则新建一个
5.获取Part对象 request.getPart
6.写一个提取文件名称的方法 (参数 part) 获取并拆分头信息,拿到其中的filename
7.通过获取文件名称的方法提取文件名
8.part.write写入指定路径
9.给返回信息
比如 上传单个文件:
jsp页面:
<body>
<form action="FileServlet" enctype="multipart/form-data" method="post">
上传文件:<input type="file" name="ufile">
<input type="submit" value="提交">
</form>
</body>
FileServlet:
@MultipartConfig(maxFileSize = 1024*1024*2) //表示servlet支持文件上传 文件最大值为2MB //获取注解里面设置的值 private static MultipartConfig config=FileServlet.class.getAnnotation(MultipartConfig.class); //允许上传的图片类型 private String Type="image/gif;image/png;image/jpg"; //上传文件路径 //服务器文件系统上的绝对路径 //success-->获取会话 //getServletContext--->获取 Servlet 上下文 //getRealPath--->获取真实路径 //filePath--->文件路径 String filePath = request.getSession().getServletContext().getRealPath("upload/"); //获取头信息 String con = part.getHeader("content-disposition");
@WebServlet("/FileServlet")
@MultipartConfig(maxFileSize = 1024*1024*2) //表示servlet支持文件上传 文件最大值为2MB
public class FileServlet extends HttpServlet {
//获取注解里面设置的值
private static MultipartConfig config=FileServlet.class.getAnnotation(MultipartConfig.class);
//允许上传的图片类型
private String Type="image/gif;image/png;image/jpg";
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//上传文件路径
//服务器文件系统上的绝对路径
//success-->获取会话
//getServletContext--->获取 Servlet 上下文
//getRealPath--->获取真实路径
//filePath--->文件路径
String filePath = request.getSession().getServletContext().getRealPath("upload/");
//如果没有路径 创建一个
File file=new File(filePath);
if (!file.exists()){
file.mkdir();
}
String message;
try {
//获取part对象
Part part = request.getPart("ufile");
//获取类型
String type = part.getContentType();
// Arrays.asList 把数组转换为集合
List<String> types = Arrays.asList(Type.split(";"));
//在允许的范围内查找
if (!(type==null || "".equals(type.trim())) && types.contains(type)){ //不空 并且集合中包含类型
//提取文件名
String name = getFileName(part);
//将文件写入路径
part.write(filePath+File.separator+name);
message="上传成功,文件名为"+name+",文件大小为:"+part.getSize()+"bytes!";
}else {
message="上传失败类型不支持";
}
}catch (IllegalStateException i){
message="上传失败!文件过大,文件的限制为"+config.maxFileSize()+"bytes!";
}catch (Exception e){
e.printStackTrace();
message=e.getMessage();
}
request.setAttribute("m",message);
request.getRequestDispatcher("success.jsp").forward(request,response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
//从Http header中提取文件上传的名称
private String getFileName(Part part){
//获取头信息
String con = part.getHeader("content-disposition");
String[] items = con.split(";");
for (String str : items) {
if (str.trim().startsWith("filename")){
return str.substring(str.indexOf("=")+2,str.length()-1);
}
}
return "";
}
}
上传多个文件大同小异:
jsp页面:
<form action="FilesServlet" enctype="multipart/form-data" method="post">
上传文件:<input type="file" name="ufile01">
上传文件:<input type="file" name="ufile02">
<input type="submit" value="提交">
</form>
</body>
FilesServlet:
@WebServlet("/FilesServlet")
@MultipartConfig
public class FilesServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
//准备路径
String path="E:\\JDBC";
//如果不存在新建
File file=new File(path);
if (!file.exists()){
file.mkdir();
}
Collection<Part> parts = request.getParts();
//循环处理
for (Part part : parts) {
if (part.getName().startsWith("ufile")){
String fileName=getFileName(part);
part.write(path+File.separator+fileName);
}
}
String message="上传成功";
request.setAttribute("m",message);
request.getRequestDispatcher("success.jsp").forward(request,response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
//从Http header中提取文件上传的名称
private String getFileName(Part part){
//获取头信息
String con = part.getHeader("content-disposition");
String[] items = con.split(";");
for (String str : items) {
if (str.trim().startsWith("filename")){
return str.substring(str.indexOf("=")+2,str.length()-1);
}
}
return "";
}
}