使用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. //拖拉图片到浏览器,可以实现预览功能
  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提交文件流。

HTML5应用之文件拖拽上传的更多相关文章

  1. html5 文件拖拽上传

    本文首先发表在  码蜂笔记 : http://coderbee.net/index.php/web/20130703/266 html5 文件拖拽上传是个老话题了,网上有很多例子,我一开始的代码也是网 ...

  2. php和js实现文件拖拽上传

    Dropzone.js实现文件拖拽上传 http://www.sucaihuo.com/php/1399.html demo http://www.sucaihuo.com/jquery/13/139 ...

  3. day25—JavaScript实现文件拖拽上传案例实践

    转行学开发,代码100天——2018-04-10 今天记录一个利用JavaScript实现文件拖拽上传到浏览器,后天将文件打开的小案例. 基本功能:1点击添加文件 2 文件拖拽添加 html: < ...

  4. Dropzone.js实现文件拖拽上传

    dropzone.js是一个开源的JavaScript库,提供 AJAX 异步文件上传功能,支持拖拽文件.支持最大文件大小.支持设置文件类型.支持预览上传结果,不依赖jQuery库. 使用Dropzo ...

  5. Dropzone.js文件拖拽上传提示Dropzone already attached 解决

    最近收到客户的反馈,在操作上传文件有时会出现没有任何.大部分时间是正常. 重现问题后,f12打开后台控制台发现如下提示: Uncaught Error: Dropzone already attach ...

  6. HTML5文件拖拽上传记录

    JS文件: var FileName = ""; var FileStr = ""; (function () { function $id(id) { ret ...

  7. SpringMvc+jQuery 文件拖拽上传、选择上传

    最近做了个简易的基于boostrap的文件上传功能,jsp版本的,后续会完善更多的功能,不过现在已经能用了,需要的小伙伴,直接引用下面的文件内容直接copy到自己的项目中就ok了,效果如图: file ...

  8. 使用bootstrap fileinput多文件拖拽上传的记录

    今天琢磨文件上传,刚好看到bootstrap 我就搜了一下,刚刚能满足需求,使用上手也很快,使用完还是记录下来. 1.首先我们下载插件包,可以用nuget搜索bootstrap-fileinput 也 ...

  9. JavaScript 文件拖拽上传插件 dropzone.js 介绍

    http://www.renfei.org/blog/dropzone-js-introduction.html

随机推荐

  1. 读书笔记-JVM

    局部变量表(虚拟机栈中的一部分)在编译期完成分配,运行期不会再改变大小: 每个方法对应一个栈帧(存储局部变量表.操作数栈.动态链接.方法出口等),栈帧被存储到虚拟机栈中,每个线程对应一个虚拟机栈,方法 ...

  2. 解决vi/vim中粘贴会在行首多很多缩进和空格的问题

    解决vi/vim中粘贴会在行首多很多缩进和空格的问题 secureCRT会将你原来的文本原封不动的按照字符串的样式发送给服务器.所以当你的服务器上的vim设置为autoindent的话,在i模式下,那 ...

  3. Response.Redirect()、Server.Execute和Server.Transfer的区别

    1.Response.Redirect(): Response.Redirect方法导致浏览器链接到一个指定的URL. 当Response.Redirect()方法被调用时,它会创建一个应答,应答头中 ...

  4. POJ 1321

    http://poj.org/problem?id=1321 一道深搜的题目,和那个POJ3740有点相类似. 也是到了现在我才知道原来深搜也有几种套路的,以前我的都是用队列来做,那个是不需要记住什么 ...

  5. Appium+Robotframework实现Android应用的自动化测试-4:AppiumLibrary介绍和安装

    Appium是个好东东,Android,iOS都支持,并且居然RobotFramework也支持Appium了,这就是本文要介绍的AppiumLibrary. 通过前面的文章大家知道可以使用多种语言来 ...

  6. VIM常用操作总结

    VIM常用的模式网上说法不太一样,但是大同小异,这里大致分一下,便于后面总结 1.一般模式 默认打开文件后的模式,这个时候只能移动光标,不能编辑 2.输入模式 一般模式按下i,就可以进入输入模式,输入 ...

  7. Java for LeetCode 235 Lowest Common Ancestor of a Binary Search Tree

    递归实现如下: public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { if(p.val>ro ...

  8. js 一搬问题汇总

    --有时无法进行js调试,在浏览器中设置启用脚本调试就可以了

  9. 【leetcode】Integer to Roman & Roman to Integer(easy)

    Roman to Integer Given a roman numeral, convert it to an integer. Input is guaranteed to be within t ...

  10. POJ 2965 The Pilots Brothers' refrigerator

    题目链接 题意:一个冰箱上有4*4共16个开关,改变任意一个开关的状态(即开变成关,关变成开)时,此开关的同一行.同一列所有的开关都会自动改变状态.要想打开冰箱,要所有开关全部打开才行. 输入:一个4 ...