1. 程式人生 > >HTML5應用之檔案拖拽上傳

HTML5應用之檔案拖拽上傳

HTML

我們在頁面中放置一個拖拽區域#drop_area,即接收拖拽的區域,#preview用來預覽拖拽上傳的圖片資訊。

<div id="drop_area">將圖片拖拽到此區域</div> 
<div id="preview"></div> 

Javascript

要想實現拖拽,頁面需要阻止瀏覽器預設行為,即四個事件(拖離、拖後放、拖進、拖來拖去),因為我們要阻止瀏覽器預設將圖片開啟的行為,這裡我們使用jQuery來完成。

$(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拖拽事件傳遞的檔案資訊,獲取本地檔案列表資訊。

var fileList = e.dataTransfer.files; 

使用files 方法將會獲取到拖拽檔案的陣列形勢的資料,每個檔案佔用一個數組的索引,如果該索引不存在檔案資料,將返回 null 值。可以通過length屬性獲取檔案數量.

var fileNum = fileList.length; 

在本例中,我們用javascript來偵聽drop事件,首先要判斷拖入的檔案是否符合要求,包括圖片型別、大小等,然後獲取本地圖片資訊,實現預覽,最後上傳。

$(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.webkitURL.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上傳。

PHP

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實現拖拽上傳的技術要點:

1、監聽拖拽:監聽頁面元素的拖拽事件,包括:dragenter、dragover、dragleave和drop,一定要將dragover的預設事件取消掉,不然無法觸發drop事件。如需拖拽頁面裡的元素,需要給其新增屬性draggable=”true”;

2、獲取拖拽檔案:在drop事件觸發後通過e.dataTransfer.files獲取拖拽檔案列表,.length屬性獲取檔案數量,.type屬性獲取檔案型別。

3、讀取圖片資料並新增預覽圖。

4、傳送圖片資料:使用FormData模擬表單資料AJAX提交檔案流。