HTML5应用之文件拖拽上传

jerry HTML 2015年08月20日 收藏

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

查看演示

HTML

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

  1. <div id="drop_area">将图片拖拽到此区域</div>
  2. <div id="preview"></div>

Javascript

要想实现拖拽,页面需要阻止浏览器默认行为,即四个事件(拖离、拖后放、拖进、拖来拖去),因为我们要阻止浏览器默认将图片打开的行为,这里我们使用jQuery来完成。

  1. $(function(){
  2. //阻止浏览器默认行。
  3. $(document).on({
  4. dragleave:function(e){ //拖离
  5. e.preventDefault();
  6. },
  7. drop:function(e){ //拖后放
  8. e.preventDefault();
  9. },
  10. dragenter:function(e){ //拖进
  11. e.preventDefault();
  12. },
  13. dragover:function(e){ //拖来拖去
  14. e.preventDefault();
  15. }
  16. });
  17. ...
  18. });

接下来我们来了解下文件API。HTML5的文件API有一个FileList接口,它可以通过e.dataTransfer.files拖拽事件传递的文件信息,获取本地文件列表信息。

  1. var fileList = e.dataTransfer.files;

使用files 方法将会获取到拖拽文件的数组形势的数据,每个文件占用一个数组的索引,如果该索引不存在文件数据,将返回 null 值。可以通过length属性获取文件数量.

  1. 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. var img = window.webkitURL.createObjectURL(fileList[0]);
  18. var filename = fileList[0].name; //图片名称
  19. var filesize = Math.floor((fileList[0].size)/1024);
  20. if(filesize>500){
  21. alert("上传大小不能超过500K.");
  22. return false;
  23. }
  24. var str = "<img src='"+img+"'><p>图片名称:"+filename+"</p><p>大小:"+filesize+"KB</p>";
  25. $("#preview").html(str);
  26. //上传
  27. xhr = new XMLHttpRequest();
  28. xhr.open("post", "upload.php", true);
  29. xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
  30. var fd = new FormData();
  31. fd.append('mypic', fileList[0]);
  32. xhr.send(fd);
  33. },false);
  34. });

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