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"+
"