ajax與html5實現非同步檔案上傳
在之前的兩篇文章中,分別介紹了XMLHttpRequest對象和iframe偽非同步檔案上傳。在此就不再介紹介紹XMLHttpRequest對象了。之前說,單憑ajax是無法實現檔案上傳的,原因是js不能操作主機的硬碟來擷取檔案。但是隨著個瀏覽器商家逐步支援HTML5(實現了對ajax非同步上傳檔案的支援),ajax非同步檔案上傳變得可能。
ajax非同步上傳思路
1.在html5中為檔案上傳的標籤<input type='file' name='' /> 的dom添加一個files檔案清單對象,通過它我們可以在js中擷取檔案的
資訊和二進位資源。
2.在XMLHttpRequest的2版中添加了 FormData對象,來載入表單提交索引值對。也可以用來負載檔案資源。
3.ajax非同步上傳檔案,並且通過自身非同步回呼函數來實現後台上傳檔案的提示資訊顯示和反饋。
前台檔案upload.html全部代碼如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><head> <title>ajax非同步檔案上傳</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="description" content="" /> <meta name="keywords" content="" /> <script type="text/javascript"> function createXHR() { var xhr=null; if(window.XMLHttpRequest) //要是支援XMLHttpRequest的則採用XMLHttpRequest產生對象 xhr=new XMLHttpRequest(); else if(window.ActiveXobject)//要是支援win的ActiveXobject則採用ActiveXobject產生對象。 xhr=new ActiveXobject('Microsoft.XMLHTTP'); return xhr; } function ajax_upload() { var xhr=createXHR(); var formData=new FormData(); var file=document.getElementsByTagName('input')[0].files[0];//擷取檔案清單中的第一個檔案,html5中支援多個檔案上傳 var info='檔案名稱:'+file.name+' 檔案類型:'+file.type+' 檔案大小:'+file.size;//擷取檔案的資訊 var showInfo=document.getElementById('showinfo'); showInfo.innerHTML=info; formData.append('pic',file);//載入圖片檔案 xhr.open('POST','./move_file.php',true); xhr.send(formData); xhr.onreadystatechange=function(){ if( this.readyState==4 && this.status==200) { showInfo.innerHTML=showInfo.innerHTML+'<br />'+this.responseText;//將後台提示資訊放到指定div中顯示 } } } </script></head><body> <input type='file' name='pic' /> <input type='button' value='提交'onclick='ajax_upload();'/> <div id='showinfo'></div></body>
後台檔案move_file.php全部代碼如下:
<?phpif(empty($_FILES))die('上傳為空白檔案');if($_FILES['pic']['error']!=0)die('檔案上傳出錯');move_uploaded_file($_FILES['pic']['tmp_name'],'./'.$_FILES['pic']['name']);echo '檔案上傳成功。';?>
截圖如下: