可控的異步上傳javascript
1.傳統的web開發文件上傳通常是基於form表單的文件上傳,同步的方式,用戶體驗差,可控性也差php
2.異步上傳的實現 有如下方式html
2.1 藉助瀏覽器插件 通常須要安裝一些相似flash的插件 這種方式 缺點:須要安裝插件 優勢:可控性強,性能高html5
2.2 這種是僞異步上傳,藉助表單向隱藏的iframe提交,而後經過iframe通訊操做當前頁面 這種方式可控行查,體驗通常,見下面代碼java
2.3 藉助html5 裏的 FormData 對象,可實現進度控制,異步的上傳方式,見代碼node
iframe方式的僞異步上傳jquery
up.htmlweb
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>title> <script type="text/javascript" src="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.js">script>head><body><form method="post" action="doup.php" enctype="multipart/form-data" target="up_file"> 姓名:<input name="user" type="text"><br> 文件:<input type="file" name="ff"><br> <input type="submit" value="提交">form><iframe name="up_file" style="display: none">iframe><div id="res">div>body>html>
View Codejson
提交處理程序代碼 doup.php後端
<?phpif($_FILES){ $f=$_FILES['ff']; $tmp_name=$f['tmp_name']; if($f['error']===0){ if(is_uploaded_file($tmp_name)){ $file_arr=pathinfo($f['name']); //防止特殊文件名 if(!is_dir('./upfile')) mkdir('./upfile',0755); $dst_file='./upfile/'.time()."-".substr(md5($file_arr['filename']),0,5).".".$file_arr['extension']; $o=move_uploaded_file($tmp_name,$dst_file); if($o){ $html=<<<E var parent=window.parent.document; var img="$dst_file' style='width:200px;height:200px;'>"; $('#res',parent).html(img); " _ue_custom_node_="true">E; echo $html; }else{ echo 0; } } } }
後端處理
藉助FormData實現真的可控行異步上傳
up1.html
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>title> <script type="text/javascript" src="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.js">script>head><body> 文件:<input type="file" name="myfile" id="myfile"><br> <p id="upbtn"> <input type="button" value="異步上傳" onclick="upload()"> <span id="uptext" style="display: none">正在上傳span> <span id="tip">span> <button id="stopbtn" style="display: none">中止上傳button> p> <div id="res">div><script> function upload(){ var fd=new FormData(); var f=$("#myfile")[0].files[0]; if(typeof f !== "object") { alert('請先選擇文件!'); return false; } fd.append('myfile',f); var xhr=new XMLHttpRequest(); xhr.upload.onprogress=function(e){ if(e.lengthComputable){ var percent=Math.round((e.loaded*100/e.total)); console.log('%d',percent); $('#tip').text(percent); } } xhr.onloadstart=function(e){ console.log("load start"); $('#tip').text('開始上傳'); $('#stopbtn').one('click',function(){ xhr.abort(); $(this).hide(); }); loading(true); } xhr.onload=function(e){ var res=xhr.responseText; var res_arr=JSON.parse(res); console.log(res_arr); if(res_arr.status==1){ $('#tip').text('上傳成功'); $('#res').html(res_arr.dst); }else{ $('#tip').text(res_arr.info); } } xhr.onerror=function(){ console.log('error'); $('#tip').text('發生錯誤'); } xhr.onloadend=function (e){ console.log("load end"); loading(false); } xhr.open("POST","./doup1.php",true); xhr.send(fd); } function loading(showloading) { if (showloading) { $("#uptxt").show(); $("#stopbtn").show(); } else { $("#uptxt").hide(); $("#stopbtn").hide(); } }script>body>html>
後端處理doup1.php
<?php$status=0;$arr=array('status'=>0,'info'=>'沒有文件上傳或上傳配置問題');if($_FILES){ $f=$_FILES['myfile']; $tmp_name=$f['tmp_name']; if($f['error']===0){ if(is_uploaded_file($tmp_name)){ $file_arr=pathinfo($f['name']); if(!is_dir('./upfile')) mkdir('./upfile',0755); $dst_file='./upfile/'.time()."-".substr(md5($file_arr['filename']),0,5).".".$file_arr['extension']; $o=move_uploaded_file($tmp_name,$dst_file); if($o){ $arr=array('dst'=>$dst_file,'status'=>1); }else{ $arr=array('status'=>0,'info'=>'移動文件失敗'); } } }else{ $arr=array('status'=>0,'info'=>"up_err_code:".$f['error']); } }echo json_encode($arr);