zoukankan      html  css  js  c++  java
  • HTML5应用之文件拖拽上传

    使用HTML5的文件API,可以将操作系统中的文件拖放到浏览器的指定区域,实现文件上传到服务器。本文将结合实例讲解HTML5+jQuery+PHP实现拖拽上传图片的过程,来看下HTML5的魅力吧。

    HTML

    我们在页面中放置一个拖拽区域#drop_area,即接收拖拽的区域,#preview用来预览拖拽上传的图片信息。

    1 <div id="drop_area">将图片拖拽到此区域</div> 
    2 <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事件,首先要判断拖入的文件是否符合要求,包括图片类型、大小等,然后获取本地图片信息,实现预览,最后上传。

     1 $(function(){ 
     2     ...接上部分 
     3     var box = document.getElementById('drop_area'); //拖拽区域 
     4     box.addEventListener("drop",function(e){ 
     5         e.preventDefault(); //取消默认浏览器拖拽效果 
     6         var fileList = e.dataTransfer.files; //获取文件对象 
     7         //检测是否是拖拽文件到页面的操作 
     8         if(fileList.length == 0){ 
     9             return false; 
    10         } 
    11         //检测文件是不是图片 
    12         if(fileList[0].type.indexOf('image') === -1){ 
    13             alert("您拖的不是图片!"); 
    14             return false; 
    15         } 
    16          
    17         //拖拉图片到浏览器,可以实现预览功能 
    18         var img = window.webkitURL.createObjectURL(fileList[0]); 
    19         var filename = fileList[0].name; //图片名称 
    20         var filesize = Math.floor((fileList[0].size)/1024);  
    21         if(filesize>500){ 
    22             alert("上传大小不能超过500K."); 
    23             return false; 
    24         } 
    25         var str = "<img src='"+img+"'><p>图片名称:"+filename+"</p><p>大小:"+filesize+"KB</p>"; 
    26         $("#preview").html(str); 
    27          
    28         //上传 
    29         xhr = new XMLHttpRequest(); 
    30         xhr.open("post", "upload.php", true); 
    31         xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest"); 
    32          
    33         var fd = new FormData(); 
    34         fd.append('mypic', fileList[0]); 
    35              
    36         xhr.send(fd); 
    37     },false); 
    38 }); 

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

    PHP

    upload.php用于接收上传的文件信息,完成上传,实现代码如下:

     1 <?php 
     2 $mypic = $_FILES["mypic"]; 
     3 if(!empty($mypic)){ 
     4     $picname = $_FILES['mypic']['name']; 
     5     $picsize = $_FILES['mypic']['size']; 
     6     if ($picsize > 512000) { 
     7         echo '图片大小不能超过500k'; 
     8         exit; 
     9     } 
    10     $type = strstr($picname, '.'); 
    11     if ($type != ".gif" && $type != ".jpg") { 
    12         echo '图片格式不对!'; 
    13         exit; 
    14     } 
    15     $pics = 'helloweba' . $type; 
    16     //上传路径 
    17     $pic_path = "pics/". $pics; 
    18     move_uploaded_file($mypic["tmp_name"],$pic_path); 
    19 } 
    20 ?> 
    21 <meta charset="utf-8"> 
    22 <form action="" method="post" enctype="multipart/form-data"> 
    23 <input type="file" name="mypic"> 
    24 <input type="submit" value="上传"> 
    25 </form>  

    最后总结下HTML5实现拖拽上传的技术要点:

    1、监听拖拽:监听页面元素的拖拽事件,包括:dragenter、dragover、dragleave和drop,一定要将dragover的默认事件取消掉,不然无法触发drop事件。如需拖拽页面里的元素,需要给其添加属性draggable=”true”;

    2、获取拖拽文件:在drop事件触发后通过e.dataTransfer.files获取拖拽文件列表,.length属性获取文件数量,.type属性获取文件类型。

    3、读取图片数据并添加预览图。

    4、发送图片数据:使用FormData模拟表单数据AJAX提交文件流。

  • 相关阅读:
    数据中台实战(六):交易分析
    数据中台实战(五):自助分析平台(产品设计篇)
    数据中台实战(四):商品分析(产品设计篇)
    数据中台实战(三):用户分析(产品设计篇)
    数据中台实战(二):基于阿里OneData的数据指标管理体系
    数据中台实战(一):以B2B电商亿订为例,谈谈产品经理视角下的数据埋点
    LeetCode82. 删除排序链表中的重复元素 II
    LeetCode203. 移除链表元素
    LeetCode445. 两数相加 II
    LeetCode2. 两数相加
  • 原文地址:https://www.cnblogs.com/joyco773/p/5438555.html
Copyright © 2011-2022 走看看