java web中的servlet3 upload上传文件实践
Servlet3.0之前的版本中,文件上传是个挺让人头疼的问题,虽然有第三方框架来实现,但使用也还是比较麻烦,在Servlet3.0中,这些问题将不复存在,Servlet3.0对文件上传提供了直接支持,配合Servlet3.0中基于Annotations的配置,大大简化上传件的操作。
一、javax.servlet.http中Part接口
publicinterfacePart
要上传文件必须使用multipart/form-data作为requestbody。
版本:
Servlet3.1-ApacheTomcat8.0.33
二、方法概述
三、@MultipartConfig注解
用于处理文件上传的servlet必须使用@MultipartConfig注解,@MultipartConfig注解有4个属性。
四、处理文件上传的servlet
//此处的@MultipartConfig注解给出了文件存放的地址和允许上传的文件最大值 @MultipartConfig(location="F:/",maxFileSize=1024*1024*20) @WebServlet(name="UploadFileTest",urlPatterns="/upload") publicclassUploadFileTestextendsHttpServlet{ privatestaticfinallongserialVersionUID=1L; //使用了commons-logging和log4j来处理日志 privatestaticLoglog=LogFactory.getLog(UploadFileTest.class); //获取注解中设置的值 privatestaticMultipartConfigconfig =UploadFileTest.class.getAnnotation(MultipartConfig.class); publicUploadFileTest(){ //TODOAuto-generatedconstructorstub } publicvoiddoPost(HttpServletRequestrequest, HttpServletResponseresponse)throwsServletException,IOException{ request.setCharacterEncoding("UTF-8"); Partpart=null; try{ part=request.getPart("file");//获取part用于处理上传的文件 }catch(IllegalStateExceptionise){ //上传的单个文件超出maxFileSize或者上传的总的数据量超出maxRequestSize时会抛出此异常 if(config.maxRequestSize()==-1L)//如果注解中没设置此项,那就是单个文件超出限制 log.error("单个文件超限"); elseif(config.maxFileSize()==-1L)//如果注解中没有设置单个文件最大限制,那就是总数据量超限。 log.error("总数据量超限"); else log.error("Error"); } if(part==null) return; StringfileName=part.getSubmittedFileName();//获得上传的文件名,没有判断用户没有选择文件直接提交的情况,没有判断上传文件失败的情况 log.info("contentType:"+part.getContentType()); log.info("fileName:"+fileName); log.info("fileSize:"+part.getSize()); log.info("headernames:"); for(StringheaderName:part.getHeaderNames()) log.info(headerName+":"+part.getHeader(headerName)); //为了避免文件重名,将时间组合到了文件名中。实际项目中可以考虑使用用户主键或者生成一个唯一的ID来组合文件名。 StringsaveName=System.currentTimeMillis()+fileName; part.write(saveName);//将上传的文件保存到磁盘,默认是注解中location的相对地址,也可以传入一个绝对路径 response.setContentType("text/html;charset=UTF-8"); PrintWriterout=response.getWriter(); StringdocType= "\n"; out.println(docType+ "\n"+ "UploadFile \n"+ "\n"+ " UploadFile\n"+ " 上传文件"+fileName+"成功,"+ "可以到项目目录的F:\\下查看,保存的文件名是:"+ saveName+"\n"+ "