public class FileUploadServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//判断表单是否包含文件域(其实也就是判断表单是否包含enctype="multipart/form-data"属性)
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
if(isMultipart){
//为上传的文件创建工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
//设置临时目录缓存文件大小
factory.setSizeThreshold(5*1024);
// 获得容器(如:tomcat服务器)上下文环境
ServletContext servletContext = this.getServletConfig().getServletContext();
//临时目录存在点,由服务器决定,tomcat的临时目录是work
File repository = (File) servletContext.getAttribute("javax.servlet.context.tempdir");
//设置工厂的临时目录
factory.setRepository(repository);
// 创建文件上传处理程序
ServletFileUpload upload = new ServletFileUpload(factory);
//允许上传的最大文件5mb
upload.setSizeMax(5*1024*1024);
//设置上传文件的最终存放路径,存放在部署项目的upload文件夹下
String uploadPath = servletContext.getRealPath("/")+File.separator+"upload";
try {
// 解析上传文件的 表单请求参数(即表单的name属性)
List<FileItem> items = upload.parseRequest(request);
Iterator<FileItem> iter = items.iterator();
//遍历name属性(表单属性份为两种:1.普通name属性 2.文件域)
String name = "";
while (iter.hasNext()) {
//表单name属性对象的input元素
FileItem item = iter.next();
String filedName = item.getFieldName();//获取field的name属性
String filedValue = item.getString();//获取field的值(value)
//判断是普通name,还是文件域
if (item.isFormField()) {
//测试普通表单域
System.out.println(filedValue);
//注意!!!!!!!!!!!!!!!!!!!!!
//获取普通表单域中的value时,不能再像以往那样使用getParameter()方法了,因为普通表单域也在流中,我们应该
//通过FileItem的getString()获取普通表单域中的value。如果想通过name获取,应该使用下面的方式:
if("name".equals(filedName)){
// name = item.getString();
name = item.getString("utf-8");//使用utf-8的编码方式获取,也可以采用平台默认的编码方式,如上
}
} else {
//表单中的文件域且文件域不为空
if(!"".equals(filedName.trim())){
//要上传的文件
File file = new File(uploadPath, item.getName());
//上传文件
item.write(file);
//删除临时文件(也可以使用监听器自动删除临时文件)
item.delete();
// 在web.xml中加入下面内容:
// <listener>
// <listener-class>
// org.apache.commons.fileupload.servlet.FileCleanerCleanup
// </listener-class>
// </listener>
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
使用commons-fileupload上传文件
最新推荐文章于 2021-06-20 21:55:00 发布