java基于servlet的文件异步上传
在这里使用了基于servlet的文件异步上传,好了废话不多说,直接上代码了。。。
packagecom.future.zfs.util; importjava.io.File; importjava.io.IOException; importjava.io.PrintWriter; importjava.util.Iterator; importjava.util.List; importjavax.servlet.ServletException; importjavax.servlet.http.HttpServlet; importjavax.servlet.http.HttpServletRequest; importjavax.servlet.http.HttpServletResponse; importorg.apache.commons.fileupload.FileItem; importorg.apache.commons.fileupload.FileUploadException; importorg.apache.commons.fileupload.FileUploadBase.SizeLimitExceededException; importorg.apache.commons.fileupload.disk.DiskFileItemFactory; importorg.apache.commons.fileupload.servlet.ServletFileUpload; @SuppressWarnings("serial") publicclassFileUploadServletextendsHttpServlet{ finallongMAX_SIZE=10*1024*1024;//设置上传文件最大为10M //允许上传的文件格式的列表 finalString[]allowtype=newString[]{"jpg","jpeg","gif","txt","doc","docx","mp3","wma","m4a","xls"}; publicFileUploadServlet(){ super(); } publicvoiddestroy(){ super.destroy(); } @Override protectedvoidservice(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ response.setContentType("text/html"); //设置字符编码为UTF-8,这样支持汉字显示 response.setCharacterEncoding("UTF-8"); //实例化一个硬盘文件工厂,用来配置上传组件ServletFileUpload DiskFileItemFactorydfif=newDiskFileItemFactory(); dfif.setSizeThreshold(4096);//设置上传文件时用于临时存放文件的内存大小,这里是4K.多于的部分将临时存在硬盘 dfif.setRepository(newFile(request.getRealPath("/") +"uploadtemp"));//设置存放临时文件的目录,web根目录下的uploadtemp目录 //用以上工厂实例化上传组件 ServletFileUploadsfu=newServletFileUpload(dfif); //设置最大上传尺寸 sfu.setSizeMax(MAX_SIZE); PrintWriterout=response.getWriter(); //从request得到所有上传域的列表 ListfileList=null; try{ fileList=sfu.parseRequest(request); }catch(FileUploadExceptione){//处理文件尺寸过大异常 if(einstanceofSizeLimitExceededException){ out.println("{message:'文件尺寸超过规定大小:"+MAX_SIZE+"字节'}"); return; } e.printStackTrace(); } //没有文件上传 if(fileList==null||fileList.size()==0){ out.println("{message:'请选择上传文件'}"); return; } //得到所有上传的文件 IteratorfileItr=fileList.iterator(); //循环处理所有文件 while(fileItr.hasNext()){ FileItemfileItem=null; Stringpath=null; longsize=0; //得到当前文件 fileItem=(FileItem)fileItr.next(); //忽略简单form字段而不是上传域的文件域(<inputtype="text"/>等) if(fileItem==null||fileItem.isFormField()){ continue; } //得到文件的完整路径 path=fileItem.getName(); //得到文件的大小 size=fileItem.getSize(); if("".equals(path)||size==0){ out.println("{message:'请选择上传文件'}"); return; } //得到去除路径的文件名 Stringt_name=path.substring(path.lastIndexOf("\\")+1); //得到文件的扩展名(无扩展名时将得到全名) Stringt_ext=t_name.substring(t_name.lastIndexOf(".")+1); //拒绝接受规定文件格式之外的文件类型 intallowFlag=0; intallowedExtCount=allowtype.length; for(;allowFlag<allowedExtCount;allowFlag++){ if(allowtype[allowFlag].equals(t_ext)) break; } if(allowFlag==allowedExtCount){ Stringmessage=""; for(allowFlag=0;allowFlag<allowedExtCount;allowFlag++){ message+="*."+allowtype[allowFlag] +""; } out.println("{message:'请上传以下类型的文件"+message+"'}"); return; } longnow=System.currentTimeMillis(); //根据系统时间生成上传后保存的文件名 Stringprefix=String.valueOf(now); //保存的最终文件完整路径,保存在web根目录下的upload目录下 Stringu_name=request.getRealPath("/")+"upload/" +prefix+"."+t_ext; //原来的文件名 path=request.getRealPath("/")+"upload/"+path; try{ //保存文件 fileItem.write(newFile(path)); response.setStatus(200); out.println("{message:\"文件上传成功.已保存为:"+prefix+"."+t_ext +"文件大小:"+size+"字节\"}"); }catch(Exceptione){ e.printStackTrace(); } } } }
web.xml
<servlet> <servlet-name>fileUploadServlet</servlet-name> <servlet-class>com.future.zfs.util.FileUploadServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>fileUploadServlet</servlet-name> <url-pattern>/fileUploadServlet</url-pattern> </servlet-mapping>
上传页面
<%@pagelanguage="java"contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPEhtmlPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <metahttp-equiv="Content-Type"content="text/html;charset=UTF-8"> <title>Inserttitlehere</title> <scripttype="text/javascript"src="js/jquery.js"></script> <scripttype="text/javascript"src="js/ajaxfileupload.js"></script> <scripttype="text/javascript"> functionajaxFileUpload() { $("#loading") .ajaxStart(function(){ $(this).show(); })//开始上传文件时显示一个图片 .ajaxComplete(function(){ $(this).hide(); });//文件上传完成将图片隐藏起来 $.ajaxFileUpload ( { url:'fileUploadServlet',//用于文件上传的服务器端请求地址 secureuri:false,//一般设置为false fileElementId:'file',//文件上传空间的id属性<inputtype="file"id="file"name="file"/> dataType:'json',//返回值类型一般设置为json success:function(data,status)//服务器成功响应处理函数 { //alert(data.message);//从服务器返回的json中取出message中的数据,其中message为在struts2中定义的成员变量 $('#myspan').html(data.message); if(typeof(data.error)!='undefined') { if(data.error!='') { //alert(data.error); $('#myspan').html(data.message); }else { //alert(data.message); $('#myspan').html(data.message); } } }, error:function(data,status,e)//服务器响应失败处理函数 { //alert(e); $('#myspan').html(e); } } ) returnfalse; } </script> </head> <body> <imgsrc="images/loading.gif"id="loading"style="display:none;"> <spanstyle="color:red;"id="myspan"></span><br/> <inputtype="file"id="file"name="file"/> <br/> <inputtype="button"value="上传"onclick="returnajaxFileUpload();"> <ahref="fileDownLoadServlet?filename=通讯录.xls">哈哈,测试文件下载</a> </body> </html>
需要注意的是:在使用ajaxFileUpload基于servlet上传时需要设置response.setContentType("text/html");尽管dataType:'json'设置为json仍要设置response.setContentType("text/html");否则获取不到服务器端返回的数据以及会弹出一个对话框。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。