继上次实现文件上传功能后,产品经理又提出了新的需求:上传图片预览及进度条效果。本次就来搞定这个功能,这次开发基于上次的随笔,需要的小伙伴们自取 -- 如何使用Ajax实现简单的文件上传。
在绛县等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供做网站、网站建设 网站设计制作按需网站设计,公司网站建设,企业网站建设,高端网站设计,成都全网营销,外贸网站建设,绛县网站建设费用合理。
要想实现文件预览效果,这里使用的是 FileReader 对象。使用它的 readAsDataURL 方法将图片内容转化为URL格式的Base64字符串,然后就可以在其onload事件中用src属性将图片渲染到页面进行预览了。
要想实现文件上传进度效果,这里使用的是xhr(XMLHttpRequest)的 progress 事件。在此方法中我们可以获取到文件的总大小以及已经发送的大小,进而计算得到上传的百分比。
理论存在,开始实践!
在上次的Demo基础上对页面进行了一些调整,代码如下:
<div> <inputid="upload" type="file" multiple style="display: none;" /> <inputid="bt1" type="button" value="点击选择" /> <inputid="bt2" type="button" value="打印对象" /> <inputid="bt3" type="button" value="加载预览" /> <inputid="bt4" type="button" value="开始上传" /> <span>上传进度:span><spanid="prog">0%span> <br/> <divid="div1" style="height: 200px;">div> div> <scripttype="text/javascript"> $(function () { var upload= $("#upload"); $("#bt1").on('click',function () { upload.click(); }); $("#bt2").on('click',function () { console.log(upload[0].files); }); $("#bt3").on('click',function () { var div= $("#div1"); for (var i= 0; i< upload[0].files.length; i++) { var reader= new FileReader(); reader.readAsDataURL(upload[0].files[i]);//依次读取图片 reader.onload= function (e) {//读取完毕回调 var img= $("").attr('src', e.target.result); div.append(img);//将其追加到页面上 } } }); $("#bt4").on('click',function () { var formdata= new FormData(); for (var i= 0; i< upload[0].files.length; i++) { formdata.append('pic', upload[0].files[i]); } $.ajax({ type:"post", url:"Default/Upload", data: formdata, contentType:false, processData:false, success:function (data) { console.log("success!"); }, error:function () { console.error("error!"); }, xhr:function () { var myXhr= $.ajaxSettings.xhr(); if (myXhr.upload) {//检查upload属性是否存在 myXhr.upload.addEventListener('progress', progressHandlingFunction,false);//绑定progress事件的回调函数 } return myXhr;//xhr对象返回给jQuery使用 } }); function progressHandlingFunction(event) { var loaded= Math.floor(100 * (event.loaded/ event.total));//计算已经上传的百分比 $("#prog").html(loaded+ "%");//应用到显示UI,可根据自己需要修改 } }); }) script>