文件拖拽上傳


使用HTML5的文件API,可以將操作系統中的文件拖放到瀏覽器的指定區域,實現文件上傳到服務器。本文將結合實例講解HTML5+jQuery+PHP實現拖拽上傳圖片的過程,來看下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.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上傳。

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提交文件流。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM