HTML5开发 拖拽文件上传

Drag&Drop 拖拽功能的处理


关于HTML5拖拽文件上传,其实国外已经有很多网站有这样的应用,最早推出拖拽上传应用的是 Gmail,它支持标准浏览器下拖拽本地文件到浏览器中作为邮件的附件发送,但其实现在利用HTML5的功能实现,主要借助于新版支持的浏览器来实现,IE还是弱很多。

拖拽上传应用主要使用了以下 HTML5技术:

Drag&Drop : HTML5基于拖拽的事件机制.
File API : 可以很方便的让 Web 应用访问文件对象,File API 包括FileList、Blob、File、FileReader、URI scheme,本文主要讲解拖拽上传中用到的 FileList 和 FileReader 接口。
FormData : FormData 是基于 XMLHttpRequest Level 2的新接口,可以方便 web 应用模拟 Form 表单数据,重要的是它支持文件的二进制流数据,这样我们就能够通过它来实现 AJAX 向后端发送文件数据了。

HTML5 Drag & Drop 事件

过去我们想实现网页中的拖拽效果,基本上都是使用DOM事件模型中的mousedown、mousemove、mouseup的事件监听来模拟拖拽效果,为了实现实时的拖拽移动效果,还要不停地获取鼠标的坐标,还要不停的修改元素的位置,代码要堆很多,而且性能上也很不好(不停地修改元素位置会导致页面reflow,除非绝对定位),现在有了html5原生的Drag & Drop 拖拽事件,真的是方便了许多,用”事半功倍”来形容绝不为过。
Drag & Drop 包括以下事件:
dragstart: 要被拖拽的元素开始拖拽时触发,这个事件对象是被拖拽元素
dragenter: 拖拽元素进入目标元素时触发,这个事件对象是目标元素
dragover: 拖拽某元素在目标元素上移动时触发,这个事件对象是目标元素
dragleave: 拖拽某元素离开目标元素时触发,这个事件对象是目标元素
dragend: 在drop之后触发,就是拖拽完毕时触发,这个事件对象是被拖拽元素
drop: 将被拖拽元素放在目标元素内时触发,这个事件对象是目标元素

完成一次成功页面元素拖拽的行为事件过程:
dragstart –> dragenter –> dragover –> drop –> dragend

要想实现拖拽,首页需要阻止浏览器默认行为,一共四个事件。

$(document).on({
    dragleave:function(e){    //拖离
e.preventDefault();
$(‘.dashboard_target_box‘).removeClass(‘over‘);
    },
    drop:function(e){        //拖后放
e.preventDefault();
    },
    dragenter:function(e){    //拖进
e.preventDefault();
$(‘.dashboard_target_box‘).addClass(‘over‘);
    },
    dragover:function(e){    //拖来拖去
e.preventDefault();
$(‘.dashboard_target_box‘).addClass(‘over‘);
    }
});

获取文件数据 HTML5 File API

File API 中的 FileList 接口,它主要通过两个途径获取本地文件列表:
一种是 < input type=“file”>的表单形式,
一种是 e.dataTransfer.files拖拽事件传递的文件信息

var fileList = e.dataTransfer.files;

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

var fileNum = fileList.length;

判断文件类型

fileList[0].type.indexOf (’image’);

FormData 模拟表单实现Ajax文件上传

file.getAsBinary获取文件流很简单,但是要想上传数据,就要模拟一下表单的数据格式了,首先看看模拟表单的 js 代码, FormData模拟表单数据时更是简洁,不用麻烦的去拼字符串,而是直接将数据 append 到 formdata 对象中即可

xhr = new XMLHttpRequest();
xhr.open("post", "test.php", true);
xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
var fd = new FormData();
fd.append(‘ff‘, fileList[0]);
xhr.send(fd);

演示地址:

点击上传:测试网站!!!
前端的代码如下:

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<style>
.dashboard_target_box {
    width:500px;
    height:300px;
    border:3px dashed #F53708;
    text-align:center;
    position:absolute;
    z-index:2000;
    top:0;
    left:0;
    cursor:pointer
}
.dashboard_target_box.over {
    border:3px dashed #000;
    background:#ffa
}
.dashboard_target_messages_container {
    display:inline-block;
    margin:12px 0 0;
    position:relative;
    text-align:center;
    height:44px;
    overflow:hidden;
    z-index:2000
}
.dashboard_target_box_message {
    position:relative;
    margin:4px auto;
    font:15px/18px helvetica, arial, sans-serif;
    font-size:15px;
    color:#999;
    font-weight:normal;
    width:150px;
    line-height:20px
}
.dashboard_target_box.over #dtb-msg1 {
    color:#000;
    font-weight:bold
}
.dashboard_target_box.over #dtb-msg3 {
    color:#ffa;
    border-color:#ffa
}
#dtb-msg2 {
    color:orange
}
#dtb-msg3 {
    display:block;
    border-top:1px #EEE dotted;
    padding:8px 24px
}
</style>
<script>
$(document).ready(function(){

   //设计一段比较流行的滑动样式
        $(‘#drop_zone_home‘).hover(function(){
            $(this).children(‘p‘).stop().animate({top:‘0px‘},200);
        },function(){
            $(this).children(‘p‘).stop().animate({top:‘-44px‘},200);
        });

        //要想实现拖拽,首页需要阻止浏览器默认行为,一个四个事件。
        $(document).on({
            dragleave:function(e){        //拖离
                e.preventDefault();
                $(‘.dashboard_target_box‘).removeClass(‘over‘);
            },
            drop:function(e){            //拖后放
                e.preventDefault();
            },
            dragenter:function(e){        //拖进
                e.preventDefault();
                $(‘.dashboard_target_box‘).addClass(‘over‘);
            },
            dragover:function(e){        //拖来拖去
                e.preventDefault();
                $(‘.dashboard_target_box‘).addClass(‘over‘);
            }
        });

        //================上传的实现
        var box = document.getElementById(‘target_box‘); //获得到框体

          box.addEventListener("drop",function(e){

            e.preventDefault(); //取消默认浏览器拖拽效果

            var fileList = e.dataTransfer.files; //获取文件对象
            //fileList.length 用来获取文件的长度(其实是获得文件数量)

            //检测是否是拖拽文件到页面的操作
            if(fileList.length == 0){
                $(‘.dashboard_target_box‘).removeClass(‘over‘);
                return;
            }
            //检测文件是不是图片
            if(fileList[0].type.indexOf(‘image‘) === -1){
                $(‘.dashboard_target_box‘).removeClass(‘over‘);
                alert("不是有效的图片文件!");
                return;
            }

            //var img = window.webkitURL.createObjectURL(fileList[0]);
            //拖拉图片到浏览器,可以实现预览功能

            xhr = new XMLHttpRequest();
            xhr.open("post", "html5.php", true);
            xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");

            var fd = new FormData();
            fd.append(‘ff‘, fileList[0]);

            xhr.send(fd);
            var picsize=fileList[0].size/1024;
            $("#Lists").html(‘<strong>‘ + fileList[0].name + ‘</strong>(‘ + (fileList[0].type || "n/a") + ‘) - ‘ + picsize.toFixed(2) +‘ KB <a href="pic/‘+fileList[0].name+‘" target="_blank">查看图片</a>‘);

        },false);

});
</script>

<div id="target_box" class="dashboard_target_box">
  <div id="drop_zone_home" class="dashboard_target_messages_container">
    <p id="dtb-msg2" class="dashboard_target_box_message" style="top:-44px">选择你的图片<br>
      开始上传</p>
    <p id="dtb-msg1" class="dashboard_target_box_message" style="top:-44px">拖动图片到<br>
      这里</p>
    </p>
  </div>
  <div id="Lists"></div>
</div>
时间: 2024-12-18 23:56:07

HTML5开发 拖拽文件上传的相关文章

Java实现HTML5拖拽文件上传

这是主页面 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+reques

H5中的拖拽文件上传

一:介绍 1.内容摘要 2.主要设计的技术 3.drag与drop事件 4.drag与drop的部分重要代码 5.File Api 6.formData 二:程序演示 1. 1 <!DOCTYPE HTML> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title>无标题文档</title> 6 <script src="D:\jquery\jquer

jsp开发无刷新文件上传程序代码

原文:jsp开发无刷新文件上传程序代码 源代码下载地址:http://www.zuidaima.com/share/1550463484660736.htm 无刷新文件上传程序代码 源代码截图

File杂谈——拖拽异步上传实现

在前一篇文章<File杂谈--拖拽上传前传>中我制作了一个静态的拖拽上传界面,拖拽文件到显示区域释放,可以显示拖入文件的基本信息.本文将在此基础上进一步加工,打造一个完整的拖拽上传示例. 示例说明 点击区域选择文件或直接将文件拖入区域,触发文件上传功能,文件将异步发送到服务器.待服务端处理完成后返回基本信息,在页面中显示.由于服务器容量问题,本示例未做文件保存处理,只是简单的将文件基本信息返回,文件上传的后端具体处理逻辑需要自行补充. 新的小伙伴FormData 我们知道,传统的文件上传如果要

Web开发安全之文件上传安全

很长一段时间像我这种菜鸡搞一个网站第一时间反应就是找上传,找上传.借此机会把文件上传的安全问题总结一下. 首先看一下DVWA给出的Impossible级别的完整代码: <?php if( isset( $_POST[ 'Upload' ] ) ) { // Check Anti-CSRF token checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' ); // File informa

iOS多线程与网络开发之小文件上传

郝萌主倾心贡献,尊重作者的劳动成果,请勿转载. 假设文章对您有所帮助,欢迎给作者捐赠,支持郝萌主,捐赠数额任意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 游戏官方下载:http://dwz.cn/RwTjl 游戏视频预览:http://dwz.cn/RzHHd 游戏开发博客:http://dwz.cn/RzJzI 游戏源代码传送:http://dwz.cn/Nret1 A.文件上传 思路: 发送文件数据给server 使用post请求 必须手动设置请求头: 内

python运维开发(二十一)----文件上传和验证码+session

内容目录: 文件上传 HTML Form表单提交 ajax提交 原生ajax提交 jQuery Ajax提交 验证码+session 文件和图片的上传功能

iOS开发之多文件上传

// //  ViewController.m //  B03-多文件上传 // //  Created by 0426iOS on 15/7/1. //  Copyright (c) 2015年 0426iOS. All rights reserved. // #import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad {

Java Web开发中的文件上传与下载

一.借助Struts2框架 1.环境搭建 1.1 导包:conmmons-fileupload-1.2.1.jar conmmons-io-1.4.jar 以及其他框架的jar包 2.页面:略 3.文件上传: 3.1 设计一个文件上传工具类:FileUploadUtils 1 public class FileUploadUtils{ 2 3 //文件要上传到的路径,可配置 4 @Resource 5 private String filePath; 6 7 private String cre