文件拖拽上傳

使用HTML5的文件API,能夠將操做系統中的文件拖放到瀏覽器的指定區域,實現文件上傳到服務器。本文將結合實例講解HTML5+jQuery+PHP實現拖拽上傳圖片的過程,來看下HTML5的魅力吧。javascript

HTML

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

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

Javascript

要想實現拖拽,頁面須要阻止瀏覽器默認行爲,即四個事件(拖離、拖後放、拖進、拖來拖去),由於咱們要阻止瀏覽器默認將圖片打開的行爲,這裏咱們使用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上傳。數組

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

一、監聽拖拽:監聽頁面元素的拖拽事件,包括:dragenter、dragover、dragleave和drop,必定要將dragover的默認事件取消掉,否則沒法觸發drop事件。如需拖拽頁面裏的元素,須要給其添加屬性draggable=」true」;app

二、獲取拖拽文件:在drop事件觸發後經過e.dataTransfer.files獲取拖拽文件列表,.length屬性獲取文件數量,.type屬性獲取文件類型。

三、讀取圖片數據並添加預覽圖。

四、發送圖片數據:使用FormData模擬表單數據AJAX提交文件流。

相關文章
相關標籤/搜索