基于WebUploader的文件上传js插件
首先把地址甩出来,http://fex-team.github.io/webuploader/
里面有比较完整的demo案例文档,本文主要是基于文件上传和图片上传增加了大量的注释,基本保证了每行代码都有注释以助于理解,是对官网demo的增强版,希望可以帮助大家更好的理解该插件
首先是文件上传
jQuery(function(){ var$=jQuery, $list=$('#thelist'), $btn=$('#ctlBtn'), state='pending', uploader; //初始化,实际上可直接访问Webuploader.upLoader uploader=WebUploader.create({ //不压缩image resize:false, //swf文件路径 swf:BASE_URL+'/js/Uploader.swf', //发送给后台代码进行处理,保存到服务器上 server:'http://webuploader.duapp.com/server/fileupload.php', //选择文件的按钮。可选。 //内部根据当前运行是创建,可能是input元素,也可能是flash. pick:'#picker' }); //uploader添加事件,当文件被加入队列后触发 uploader.on('fileQueued',function(file){ //在加入队列时,创建一个样式,供后面上传成功失败等等调用,定义一个*p表示指向该事件样式 $list.append('<divid="'+file.id+'"class="item">'+ '<h4class="info">'+file.name+'</h4>'+ '<pclass="state">等待上传...</p>'+ '</div>'); }); //文件上传过程中触发,携带上传进度,file表示上传的文件,percentage表示上传的进度 uploader.on('uploadProgress',function(file,percentage){ //定义一个变量名创建进度模块 var$li=$('#'+file.id), //找到$li下class为progress的,并定义为$percent------为什么先寻找在创建 $percent=$li.find('.progress.progress-bar'); //如果$percent没值,就创建进度条加入到对应的文件名下,避免重复创建 if(!$percent.length){ $percent=$('<divclass="progressprogress-stripedactive">'+ '<divclass="progress-bar"role="progressbar"style="width:0%">'+ '</div>'+ '</div>').appendTo($li).find('.progress-bar'); } //为进度模块添加弹出文本 $li.find('p.state').text('上传中'); //为进度模块创建读条的百分比 $percent.css('width',percentage*100+'%'); }); //uploader触发事件,当上传成功事调用这个事件 uploader.on('uploadSuccess',function(file){ //调用文件被加入时触发的事件,findstate,并添加文本为已上传 $('#'+file.id).find('p.state').text('已上传'); }); //uploader触发事件,当上传失败时触发该事件 uploader.on('uploadError',function(file){ //调用文件被加入时触发的事件,findstate,并添加文本为上传出错 $('#'+file.id).find('p.state').text('上传出错'); }); //该事件表示不管上传成功还是失败都会触发该事件 uploader.on('uploadComplete',function(file){ //调用 $('#'+file.id).find('.progress').fadeOut(); }); //这是一个特殊事件,所有的触发都会响应到,type的作用是记录当前是什么事件在触发,并给state赋值 uploader.on('all',function(type){ if(type==='startUpload'){ state='uploading'; }elseif(type==='stopUpload'){ state='paused'; }elseif(type==='uploadFinished'){ state='done'; } //根据state判断弹出文本 if(state==='uploading'){ $btn.text('暂停上传'); }else{ $btn.text('开始上传'); } }); //当按钮被点击时触发,根据状态开始上传或是暂停 $btn.on('click',function(){ if(state==='uploading'){ uploader.stop(); }else{ uploader.upload(); } }); });
然后是图片上传
jQuery(function(){ //将jquery赋值给一个全局的变量 var$=jQuery, $list=$('#fileList'), //优化retina,在retina下这个值是2,设备像素比 ratio=window.devicePixelRatio||1, //缩略图大小 thumbnailWidth=100*ratio, thumbnailHeight=100*ratio, //WebUploader实例 uploader; //初始化WebUploader uploader=WebUploader.create({ //自动上传。 auto:true, //swf文件路径 swf:BASE_URL+'/js/Uploader.swf', //文件接收服务端。调用代码,把图片保存在服务器端 server:'http://webuploader.duapp.com/server/fileupload.php', //选择文件的按钮。可选。 //内部根据当前运行是创建,可能是input元素,也可能是flash. pick:'#filePicker', //只允许选择文件,可选。 accept:{ title:'Images', extensions:'gif,jpg,jpeg,bmp,png', mimeTypes:'image/*' } }); //当有文件添加进来的时候触发这个事件 uploader.on('fileQueued',function(file){ //定义变量li var$li=$( //创建一个id '<divid="'+file.id+'"class="file-itemthumbnail">'+ '<img>'+ //创建一个为info的class '<divclass="info">'+file.name+'</div>'+ '</div>' ), $img=$li.find('img'); //把定义的li加入到list中 $list.append($li); //创建缩略图,此过程为异步,需要传入callBack(function(error,src)),通常在图片加入队列后调用此方法,以增强交互性 //callback有两个参数,当失败时调用error,src存放的是缩略图的地址 uploader.makeThumb(file,function(error,src){ if(error){ $img.replaceWith('<span>不能预览</span>'); return; } $img.attr('src',src); },thumbnailWidth,thumbnailHeight); }); //文件上传过程中创建进度条实时显示。 uploader.on('uploadProgress',function(file,percentage){ var$li=$('#'+file.id), $percent=$li.find('.progressspan'); //避免重复创建 if(!$percent.length){ $percent=$('<pclass="progress"><span></span></p>') .appendTo($li) .find('span'); } $percent.css('width',percentage*100+'%'); }); //文件上传成功,给item添加成功class,用样式标记上传成功。 uploader.on('uploadSuccess',function(file){ $('#'+file.id).addClass('upload-state-done'); }); //文件上传失败,现实上传出错。 uploader.on('uploadError',function(file){ var$li=$('#'+file.id), $error=$li.find('div.error'); //避免重复创建 if(!$error.length){ $error=$('<divclass="error"></div>').appendTo($li); } $error.text('上传失败'); }); //完成上传完了,成功或者失败,先删除进度条。 uploader.on('uploadComplete',function(file){ $('#'+file.id).find('.progress').remove(); }); });
下面是java的后台代码,用于获取上传文件,并将上传文件的真实路径写入服务器
1.首先我们应该为上传的文件建一个存放的位置,一般位置分为临时和真是文件夹,那我们就需要获取这俩个文件夹的绝对路径,在servlet中我们可以这样做
ServletContextapplication=this.getServletContext(); StringtempDirectory=application.getRealPath(Constant.TEMP_DIRECTORY)+"/"; StringrealDirectory=application.getRealPath(Constant.REAL_DIRECTORY)+"/";
然后建立文件工厂即仓库一个参数表示存放多大后flush,
FileItemFactoryfactory=newDiskFileItemFactory(Constant.SIZE_THRESHOLD,newFile(tempDirectory)); ServletFileUploadupload=newServletFileUpload(factory);
2.对上传的文件进行设定
upload.setSizeMax(500*1024*1024);//设置该次上传最大值为500M3,.解析请求正文,获取上传文件,不抛出异常则写入真是路径
List<FileItem>list=upload.parseRequest(request); Iterator<FileItem>iter=list.iterator(); while(iter.hasNext()){ FileItemitem=iter.next(); //item.isFormField()用来判断当前对象是否是file表单域的数据如果返回值是true说明不是就是普通表单域 if(item.isFormField()){ System.out.println("普通表单域"+item.getFieldName()); System.out.println(item.getString("utf-8")); }else{ //System.out.println("file表单域"+item.getFieldName()); /* *只有file表单域才将该对象中的内容写到真实文件夹中 */ Stringlastpath=item.getName();//获取上传文件的名称 lastpath=lastpath.substring(lastpath.lastIndexOf(".")); Stringfilename=UUID.randomUUID().toString().replace("-","")+lastpath; item.write(newFile(realDirectory+filename));
packagecom.lanyou.support.servlet; importjava.io.File; importjava.io.IOException; importjava.io.PrintWriter; importjava.util.List; importjavax.servlet.ServletException; importjavax.servlet.http.HttpServlet; importjavax.servlet.http.HttpServletRequest; importjavax.servlet.http.HttpServletResponse; importnet.sf.json.JSONObject; importorg.apache.commons.fileupload.FileItem; importorg.apache.commons.fileupload.FileItemFactory; importorg.apache.commons.fileupload.disk.DiskFileItemFactory; importorg.apache.commons.fileupload.servlet.ServletFileUpload; importorg.apache.commons.logging.Log; importorg.apache.commons.logging.LogFactory; importorg.apache.struts2.ServletActionContext; publicclassFileUploadextendsHttpServlet{ privatestaticfinallongserialVersionUID=1L; privatestaticLoglogger=LogFactory.getLog(FileUpload.class); @Override protectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp) throwsServletException,IOException{ doPost(req,resp); } @Override protectedvoiddoPost(HttpServletRequestreq,HttpServletResponseresp) throwsServletException,IOException{ //类型1事件上传文件2apk Stringt=req.getParameter("t")==null?"1":req.getParameter("t") .trim(); Stringpath=""; JSONObjectob=newJSONObject(); try{ //将请求消息中的每一个项目封装成单独DiskFileItem对象的任务 //当上传的文件项目比较小时保存在内存中,比较大时保存在磁盘零时文件夹中 //建立文件仓库(工厂) FileItemFactoryfactory=newDiskFileItemFactory(); ServletFileUploadservletFileUpload=newServletFileUpload(factory); //对上传的文件进行设定 servletFileUpload.setSizeMax(1024*1024*2);//最大2M数据 servletFileUpload.setFileSizeMax(2*1024*1024); servletFileUpload.setHeaderEncoding("UTF-8");//解决文件名乱码的问题 //解析请求正文,获取上传文件,不抛出异常则写入真实路径 //根据请求获取文件列表 List<FileItem>fileItemsList=servletFileUpload.parseRequest(req); //从文件列表中取出单独的文件对象 for(FileItemitem:fileItemsList){ //判断该文件是否是普通的表单类型,该处是file类型进入判断 if(!item.isFormField()){ //如果上传的文件大于指定的大小则return if(item.getSize()>2*1024*1024){ return; } //System.out.println("上传文件的大小:"+item.getSize()); //System.out.println("上传文件的类型:"+item.getContentType()); //System.out.println("上传文件的名称:"+item.getName()); //上传文件的名称 StringfileName=item.getName(); Stringent=""; //内容的类型 if(item.getContentType().equalsIgnoreCase("image/x-png") ||item.getContentType().equalsIgnoreCase( "image/png")){ ent=".png"; }elseif(item.getContentType().equalsIgnoreCase( "image/gif")){ ent=".gif"; }elseif(item.getContentType().equalsIgnoreCase( "image/bmp")){ ent=".bmp"; }elseif(item.getContentType().equalsIgnoreCase( "image/pjpeg") ||item.getContentType().equalsIgnoreCase( "image/jpeg")){ ent=".jpg"; } //获取文件的是那种格式 if(fileName.lastIndexOf(".")!=-1){ ent=fileName.substring(fileName.lastIndexOf(".")); } fileName="ev_"+System.currentTimeMillis()+ent; //定义文件路径,根据你的文件夹结构,可能需要做修改 if(t.equals("1")){ path="upload/ev/"+fileName; }else{ path="upload/pk/"+fileName; } //保存文件到服务器上 Filefile=newFile(req.getSession().getServletContext() .getRealPath(path)); if(!file.getParentFile().exists()){ file.getParentFile().mkdirs(); } item.write(file); //logger.info(path); //break; ob.accumulate("url",path); } } resp.setContentType("text/html;charset=UTF-8"); resp.getWriter().write(ob.toString()); }catch(Exceptione){ e.printStackTrace(); }finally{ //响应客户端 //resp.setContentType("text/html;charset=UTF-8"); //resp.getWriter().write(ob.toString()); } } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。