在Servlet3.0之前上传文件需要借助第三方jar包才能实现,比如common-upload.jar和common-io.jar
但是在Servlet3.0之后上传文件变得很便捷,因为是特性提供的内置方法接口
Servlet3.0后,只需要在类前加上注解 @MultipartConfig 就可以指定该servlet具备上传特性
并且该注解提供了几个属性:
maxFileSize,maxRequestSize,location(将上传的文件保存到磁盘的指定位置,调用Part中write方法就会调用它),fileSizeThreshold(设定一个溢出值,超过这个值将写入磁盘)
这里有关于location的一个注意点:这里如果指定了location的值,那么在Part接口中write提供path属性后,如果path是绝对地址,那么文件写入这个绝对地址,如果是相对地址,则是相对于location的地址
下面是Part接口的方法:
以下是一个简短的demo
package upload;
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(urlPatterns={"/upload.do"})
//这个注解是可以配置信息的,比如文件临时存放目录,文件大小等等
@MultipartConfig()
public class uploadServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
Part part = req.getPart("Image");
String fileName = getName(part);
PrintWriter printWriter = null;
printWriter = resp.getWriter();
if(fileName==null){
printWriter.println("请上传有效的文件
");
printWriter.flush();
}else{
//通过判断限制文件上传的格式
if(!"png".equalsIgnoreCase(fileName.substring(fileName.indexOf('.')+1))){
printWriter.println("只允許PNG文件
");
printWriter.flush();
return;
}
String path = req.getServletContext().getRealPath(("/File/"+fileName));
part.write(path);
printWriter.println("文件名:"+fileName+"
");
printWriter.println("文件大小:"+part.getSize()+"
");
printWriter.flush();
}
if(printWriter!=null){
printWriter.close();
}
}
private String getName(Part part){
String name = null;
String ct = part.getContentType();
if(part==null) return name;
if(ct==null) return name ;//当执行文件上传的时候,ContentType不为空
String disposition = part.getHeader("content-disposition");
String[] elements = disposition.split(";");
for(String ele:elements){
if(ele.trim().startsWith("filename")){
name = ele.substring(ele.indexOf('=')+1).trim().replace("\"", "");
return name;
}else{
continue;
}
}
return name;
}
}
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>upload</title>
</head>
<body>
<form action="upload.do" method="post" enctype="multipart/form-data">
filename:<input type="file" name="Image">
<input type="submit" value="upload">
</form>
</body>
</html>
运行结果: