HTML5文件拖拽上传

  使用HTML5的文件API,可以将操作系统中的文件拖放到浏览器的指定区域,实现文件上传到服务器。

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('pic', fileList[0]); 

        xhr.send(fd); 
    },false); 
}); 

  用FormData模拟表单数据,直接将数据append到formdata对象中,实现了ajax上传。

PHP

  upload.php用于接收上传的文件信息,完成上传:

<?php  
$pic = $_FILES["pic"]; 
if(!empty($pic)){  
    $picname = $_FILES['pic']['name']; 
    $picsize = $_FILES['pic']['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($pic["tmp_name"],$pic_path); 
} 

  实现拖拽上传的技术要点:

  • 监听拖拽:监听页面元素的拖拽事件,包括:dragenter、dragover、dragleave和drop,一定要将dragover的默认事件取消掉,不然无法触发drop事件。如需拖拽页面里的元素,需要给其添加属性draggable="true"
  • 获取拖拽文件:在drop事件触发后通过e.dataTransfer.files获取拖拽文件列表,.length属性获取文件数量,.type属性获取文件类型。
  • 读取图片数据并添加预览图。
  • 发送图片数据:使用FormData模拟表单数据AJAX提交文件流。