使用HTML5的文件API,能夠將操做系統中的文件拖放到瀏覽器的指定區域,實現文件上傳到服務器。本文將結合實例講解HTML5+jQuery+PHP實現拖拽上傳圖片的過程,來看下HTML5的魅力吧。javascript
咱們在頁面中放置一個拖拽區域#drop_area,即接收拖拽的區域,#preview用來預覽拖拽上傳的圖片信息。php
<div id="drop_area">將圖片拖拽到此區域</div> <div id="preview"></div>
要想實現拖拽,頁面須要阻止瀏覽器默認行爲,即四個事件(拖離、拖後放、拖進、拖來拖去),由於咱們要阻止瀏覽器默認將圖片打開的行爲,這裏咱們使用jQuery來完成。html
$(function(){
//阻止瀏覽器默認行。
$(document).on({
dragleave:function(e){ //拖離
e.preventDefault();
},
drop:function(e){ //拖後放
e.preventDefault();
},
dragenter:function(e){ //拖進
e.preventDefault();
},
dragover:function(e){ //拖來拖去
e.preventDefault();
}
});
...
});
接下來咱們來了解下文件API。HTML5的文件API有一個FileList接口,它能夠經過e.dataTransfer.files拖拽事件傳遞的文件信息,獲取本地文件列表信息java
var fileList = e.dataTransfer.files;
使用files 方法將會獲取到拖拽文件的數組形勢的數據,每一個文件佔用一個數組的索引,若是該索引不存在文件數據,將返回 null 值。能夠經過length屬性獲取文件數量.web
var fileNum = fileList.length;
在本例中,咱們用javascript來偵聽drop事件,首先要判斷拖入的文件是否符合要求,包括圖片類型、大小等,而後獲取本地圖片信息,實現預覽,最後上傳。ajax
$(function(){ ...接上部分 var box = document.getElementById('drop_area'); //拖拽區域 box.addEventListener("drop",function(e){ e.preventDefault(); //取消默認瀏覽器拖拽效果 var fileList = e.dataTransfer.files; //獲取文件對象 //檢測是不是拖拽文件到頁面的操做 if(fileList.length == 0){ return false; } //檢測文件是否是圖片 if(fileList[0].type.indexOf('image') === -1){ alert("您拖的不是圖片!"); return false; } //拖拉圖片到瀏覽器,能夠實現預覽功能 var img = window.URL.createObjectURL(fileList[0]); var filename = fileList[0].name; //圖片名稱 var filesize = Math.floor((fileList[0].size)/1024); if(filesize>500){ alert("上傳大小不能超過500K."); return false; } var str = "<img src='"+img+"'><p>圖片名稱:"+filename+"</p><p>大小:"+filesize+"KB</p>"; $("#preview").html(str); //上傳 xhr = new XMLHttpRequest(); xhr.open("post", "upload.php", true); xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest"); var fd = new FormData(); fd.append('mypic', fileList[0]); xhr.send(fd); },false); });
咱們用FormData模擬表單數據,直接將數據append到formdata對象中,實現了ajax上傳。數組
upload.php用於接收上傳的文件信息,完成上傳,實現代碼以下:瀏覽器
<?php $mypic = $_FILES["mypic"]; if(!empty($mypic)){ $picname = $_FILES['mypic']['name']; $picsize = $_FILES['mypic']['size']; if ($picsize > 512000) { echo '圖片大小不能超過500k'; exit; } $type = strstr($picname, '.'); if ($type != ".gif" && $type != ".jpg") { echo '圖片格式不對!'; exit; } $pics = 'helloweba' . $type; //上傳路徑 $pic_path = "pics/". $pics; move_uploaded_file($mypic["tmp_name"],$pic_path); } ?>
下邊這幾句能夠沒有 <meta charset="utf-8"> <form action="" method="post" enctype="multipart/form-data"> <input type="file" name="mypic"> <input type="submit" value="上傳"> </form>
最後總結下HTML5實現拖拽上傳的技術要點:服務器
一、監聽拖拽:監聽頁面元素的拖拽事件,包括:dragenter、dragover、dragleave和drop,必定要將dragover的默認事件取消掉,否則沒法觸發drop事件。如需拖拽頁面裏的元素,須要給其添加屬性draggable=」true」;app
二、獲取拖拽文件:在drop事件觸發後經過e.dataTransfer.files獲取拖拽文件列表,.length屬性獲取文件數量,.type屬性獲取文件類型。
三、讀取圖片數據並添加預覽圖。
四、發送圖片數據:使用FormData模擬表單數據AJAX提交文件流。