理論上此類的文件/圖片上傳插件已經很多了,但是在使用的過程中還是會遇到各種各樣的問題,兼容問題、後台問題~~等等,所以既然別人的輪子我用不好,那就自己做一個吧。
本文使用jq.ajax和php實作上傳功能,前端程式碼一般無差,有的小夥伴後台不是php的,請參考貴語言的文檔進行操作即可。
先看效果圖,整個上傳介面大概是這樣的:看demo
#
整體想法:
1、建立input設定type=file,id=file,樣式設定opacity:0,position:absolute
2、建立遮罩層,並設定position:absolute並且z-index大於file
3、建立FormData對象,把file放到FormData中做成資料
4、建立ajax,發送FormData資料到upload.php,監聽ajax的progress事件,即時返回上傳進度
5、在html頁面輸出伺服器的回應
6、上傳完成之後,點選「繼續上傳」按鈕,開啟檔案選擇框,可繼續上傳。
HTML部分,比較簡單:
<p class="upload"> <p class="uploadBox"> <span class="inputCover">选择文件</span> <form enctype=""> <input type="file" name="file" id="file" /> <button type="button" class="submit">上传</button> </form> <button type="button" class="upagain">继续上传</button> <span class="processBar"></span> <span class="processNum">未选择文件</span> </p> </p>
CSS,樣式可以依照個人喜好自由調整,這裡僅供參考:
*{ font-family: 'microsoft yahei'; color: #4A4A4A; } .upload{ width: 700px; padding: 20px; border: 1px dashed #ccc; margin: 100px auto; border-radius: 5px; } .uploadBox{ width: 100%; height: 35px; position: relative; } .uploadBox input{ width: 200px; height: 30px; background: red; position: absolute; top: 2px; left: 0; z-index: 201; opacity: 0; cursor: pointer; } .uploadBox .inputCover{ width: 200px; height: 30px; position: absolute; top: 2px; left: 0; z-index: 200; text-align: center; line-height: 30px; font-size: 14px; border: 1px solid #009393; border-radius: 5px; cursor: pointer; } .uploadBox button.submit{ width: 100px; height: 30px; position: absolute; left: 230px; top: 2px; border-radius: 5px; border: 1px solid #ccc; background: #F0F0F0; outline: none; cursor: pointer; } .uploadBox button.submit:hover{ background: #E0E0E0; } .uploadBox button.upagain{ width: 100px; height: 30px; position: absolute; left: 340px; top: 2px; display: none; border-radius: 5px; border: 1px solid #ccc; background: #F0F0F0; outline: none; cursor: pointer; } .uploadBox button.upagain:hover{ background: #E0E0E0; } .processBar{ display: inline-block; width: 0; height: 7px; position: absolute; left: 500px; top: 14px; background: #009393; } .processNum{ position: absolute; left: 620px; color: #009393; font-size: 12px; line-height: 35px; }
JS部分,jq.ajax:
$(document).ready(function(){ var inputCover = $(".inputCover"); var processNum = $(".processNum"); var processBar = $(".processBar"); //上传准备信息 $("#file").change(function(){ var file = document.getElementById('file'); var fileName = file.files[0].name; var fileSize = file.files[0].size; processBar.css("width",0); //验证要上传的文件 if(fileSize > 1024*2*1024){ inputCover.html("<font>文件过大,请重新选择</font>"); processNum.html('未选择文件'); document.getElementById('file').value = ''; return false; }else{ inputCover.html(fileName+' / '+parseInt(fileSize/1024)+'K'); processNum.html('等待上传'); } }) //提交验证 $(".submit").click(function(){ if($("#file").val() == ''){ alert('请先选择文件!'); }else{ upload(); } }) //创建ajax对象,发送上传请求 function upload(){ var file = document.getElementById('file').files[0]; var form = new FormData(); form.append('myfile',file); $.ajax({ url: 'upload.php',//上传地址 async: true,//异步 type: 'post',//post方式 data: form,//FormData数据 processData: false,//不处理数据流 !important contentType: false,//不设置http头 !important xhr:function(){//获取上传进度 myXhr = $.ajaxSettings.xhr(); if(myXhr.upload){ myXhr.upload.addEventListener('progress',function(e){//监听progress事件 var loaded = e.loaded;//已上传 var total = e.total;//总大小 var percent = Math.floor(100*loaded/total);//百分比 processNum.text(percent+"%");//数显进度 processBar.css("width",percent+"px");//图显进度}, false); } return myXhr; }, success: function(data){//上传成功回调 console.log("文档当前位置是:"+data);//获取文件链接 document.cookie = "url="+data;//此行可忽略 $(".submit").text('上传成功'); $(".upagain").css("display","block"); } }) } //继续上传 $(".upagain").click(function(){ $("#file").click(); processNum.html('未选择文件'); processBar.css("width",0); $(".submit").text('上传'); document.getElementById('file').value = ''; $(this).css("display","none"); }) })
上傳完畢,upload.php處理檔(為了伺服器安全,僅貼出程式碼片段):
<?php if(isset($_FILES["myfile"])){ move_uploaded_file($_FILES["myfile"]["tmp_name"],"ajax/".$_FILES["myfile"]["name"]); echo "http://www.xuxiangbo.com/ajax/".$_FILES["myfile"]["name"]; }else{ echo 'no file'; } ?>
轉自部落格
#作者:Imin
連結:http://blog.xuxiangbo.com/im-22.html
我相信看了本文案例你已經掌握了方法,更多精彩請關注php中文網其它相關文章!
推薦閱讀:
以上是利用ajax+php實現文件上傳的詳細內容。更多資訊請關注PHP中文網其他相關文章!