HTML5拖拽上传图片预览

参考博文1:http://blog.csdn.net/testcs_dn/article/details/8695532

参考博文2:http://justcoding.iteye.com/blog/2105760

1.文件API:(File API)

file类型的的表单控件选择的每一个文件都是一个file对象,而FileList对象则是这些file对象的集合列表,代表所选择的所有文件。file对象继承于Blob对象,该对象表示二进制原始数据,提供slice方法,可以访问到字节内部的原始数据块。总之,file对象包含与FlieList对象,而file对象继承于Blob对象!

各对象的相关属性关系:

FileReader接口:

由图可知:HTML5还提供了FileReader接口:用于将文件读入内存,并读取文件中的数据。

var reader=new FileReader();

该接口总共有四个方法和六个事件:

  • readAsBinaryString(file):读取文件为二进制
  • readAsDataURL(file):读取文件DataURL
  • readAsText(file,[encoding]):读取文件为文本
  • about(none):中断文件读取

  • onabort:读取文件中断时触发
  • onerror:读取文件出错时触发
  • onloadstart:读取文件开始时触发
  • onprogress:读取文件中时一直触发
  • onload:读取文件成功时触发
  • onloadend:读取文件结束时触发(成功和失败都会触发)

以上事件参数e有e.target.resultthis.result指向读取的结果!

2.拖放API:

拖放属性:将需要拖放的元素的dragable属性设置为true(dragable=”true”)!img元素和a元素默认可以拖放。

拖放事件:(分为拖放元素事件和目标元素事件)

拖放元素事件:

  • dragstart:拖拽前触发
  • drag ,拖拽前、拖拽结束之间,连续触发
  • dragend , 拖拽结束触发

目标元素事件:

  • dragenter , 进入目标元素触发
  • dragover ,进入目标、离开目标之间,连续触发
  • dragleave , 离开目标元素触发
  • drop , 在目标元素上释放鼠标触发

但是!需要注意的是:在目标元素中dragover和drop事件中要阻止默认行为(拒绝被拖放),否则拖放不能被实现!



DataTransfer对象:专门用于存放拖放时要携带的数据,可以被设置为拖放事件的dataTransfer属性

3个属性:

  • effectAllowed : 设置光标样式(none, copy, copyLink, copyMove, link, linkMove, move, all 和 uninitialized)
  • effectAllowed:设置拖放操作的视觉效果
  • types:存入数据的种类,字符串的伪数组
  • files:获取外部拖拽的文件,返回一个fileList列表,filesList下有个type属性,返回文件的类型

4个方法:

  • setData() : 设置数据 key和value(必须是字符串)
  • getData() : 获取数据,根据key值,获取对应的value
  • clearData():清除DataTransfer对象存放的数据
  • setDragImage(imageUrl,log x,long y):用img元素来设置拖放图标
//示例:
target.addEventListener(‘dragstart‘,function(e){
    var fs = e.dataTransfer.files;//获取拖放的文件对象列表FlieList对象
    var dt=e.dataTransfer;//作为拖放事件的dataTransfer属性
    dt.effectAllowed=‘copy‘;
    dt.setData(‘text/plain‘,‘hello‘);
    dt.setDragImage(dragIcom,-10,-10);
});

3.拖拽上传图片预览:

思路:

  1. 熟悉文件拖拽 目标元素 的四个事件,注意:ondragover、ondrop事件中阻止默认行为
  2. 拖拽放置后,获取到文件对象集合:e.dataTransfer.files
  3. 循环该集合中的每个文件对象,判断文件类型以及文件大小,是指定类型则进行相应的操作
  4. 读取文件信息对象:new FileReader(),它有读取文件对象为DataUrl等方法:readAsDataURL(文件对象)、读取成功之后触发的事件:onload事件等,this.result为读取到的数据
  5. 在FileReader对象中的几个事件中进行相应的逻辑处理

HTML:

<div class="container">
   <p class="text">请将图片文件拖拽至此区域!</p>
</div>
    总加载数:<span id=‘total‘>100</span>

JQ:

<script type="text/javascript">
        $(function() {
            /*思路:
             *1.熟悉文件拖拽  目标元素 的四个事件,注意:ondragover、ondrop事件中阻止默认行为
             *2.拖拽放置后,获取到文件对象集合:e.dataTransfer.files
             *3.循环该集合中的每个文件对象,判断文件类型以及文件大小,是指定类型则进行相应的操作
             *4.读取文件信息对象:new FileReader(),它有读取文件对象为DataUrl等方法:readAsDataURL(文件对象)、读取成功之后触发的事件:onload事件等,this.result为读取到的数据
             *5.在FileReader对象中的几个事件中进行相应的逻辑处理
             *
             */

            //必须将jq对象转换为js对象,调用原生方法
            var oDiv = $(".container").get(0);
            var oP = $(".text");
            //进入
            oDiv.ondragenter = function() {
                    oP.html(‘‘);
                }
                //移动,需要阻止默认行为,否则直接在本页面中显示文件
            oDiv.ondragover = function(e) {

                    e.preventDefault();
                }
                //离开
            oDiv.onleave = function() {
                    oP.html(‘请将图片文件拖拽至此区域!‘);
                }
                //拖拽放置,也需要阻止默认行为
            oDiv.ondrop = function(e) {

                e.preventDefault();
                //获取拖拽过来的对象,文件对象集合
                var fs = e.dataTransfer.files;
                //若为表单域中的file标签选中的文件,则使用form[表单name].files[0]来获取文件对象集合
                //打印长度
                console.log(fs.length);
                //循环多文件拖拽上传
                for (var i = 0; i < fs.length; i++) {
                    //文件类型
                    var _type = fs[i].type;

                    console.log(_type);
                    //判断文件类型
                    if (_type.indexOf(‘image‘) != -1) {
                        //文件大小控制
                        console.log(fs[i].size);
                        //读取文件对象
                        var reader = new FileReader();
                        //读为DataUrl,无返回值
                        reader.readAsDataURL(fs[i]);
                        reader.onloadstart = function(e) {
                                //开始加载
                            }
                            // 这个事件在读取进行中定时触发
                        reader.onprogress = function(e) {

                            $("#total").html(e.total);
                        }

                        //当读取成功时触发,this.result为读取的文件数据
                        reader.onload = function() {
                                //文件数据
                                // console.log(this.result);
                                //添加文件预览
                                var oImg = $("<img style=‘width:100px;‘ src=‘‘ />");
                                oImg.attr("src", this.result);
                                $(oDiv).append(oImg); //oDiv转换为js对象调用方法
                            }
                            //无论成功与否都会触发
                        reader.onloadend = function() {
                            if (reader.error) {
                                console.log(reader.error);
                            } else {
                                //上传没有错误,ajax发送文件,上传二进制文件
                            }
                        }
                    } else {
                        alert(‘请上传图片文件!‘);
                    }
                }

            }
        });
    </script>

效果图:



总结:结合拖放事件API,DataTransfer对象和文件读取对象FileList等方面的知识,实现简易拖拽上传图片预览效果。需要了解熟悉个对象的关系以及用法,明确好实现思路!

时间: 2024-12-10 19:50:25

HTML5拖拽上传图片预览的相关文章

HTML5拖放事件-上传图片预览功能(学习笔记)

主要用到的知识点有dataTransfer对象和FileReader(读取文件信息) 1.创建简单的HTML标签: <body> <div id="box">请将图片拖拽至此</div> <ul></ul> </body> 2.给标签加上简单的样式: <style type="text/css"> div{ width: 300px; height: 300px; margin:10

mvc文件上传支持批量上传,拖拽以及预览,文件内容校验等

使用bootstrap-fileinput 使用方式: 1.nuget:Install-Package bootstrap-fileinput 2.语言本地化{下载fileinput_locale_zh.js}或者修改Fileinput中的本地化词汇 3.文件大小限制:修改fileinput.js中的3195行 maxFilePreviewSize配置节点 示例:前台 @{ Layout = null; } <!DOCTYPE html> <html> <head> &

通过 html5 FileReader 实现上传图片预览功能

Html 部分 <!DOCTYPE html> <html>     <head>         <meta charset="utf-8">         <title></title>     </head>     <body>         <input type="file" name="file" onchange="

HTML5 CSS3 经典案例:无插件拖拽上传图片 (支持预览与批量) (二)

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/31513065 上一篇已经实现了这个项目的整体的HTML和CSS: HTML5 CSS3 经典案例:无插件拖拽上传图片 (支持预览与批量) (一) 这篇博客直接在上篇的基础上完成,最终效果: 效果图1: 效果图2: 好了,请允许我把图片贴了两遍,方便大家看效果了~ 可以看出我们的图片的li的html其实还是挺复杂的,于是我把html文档做了一些修改: <span style=&quo

jquery实现上传图片预览(需要浏览器支持html5)

jquery实现上传图片预览(需要浏览器支持html5) <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m

用HTML5的File API做上传图片预览功能

用HTML5的File API做上传图片预览功能 前几天做了一个项目,涉及到上传本地图片的功能,正好之前了解过 html5 可以上传本地图片,然后再网上看了一些demo结合自己的需求,终于搞定了.(PS : 不得不承认我这个人有多懒,没有需求的时候我向来不主动去学习).移动端完全支持哦!已测试. 下面给大家看看代码吧怎么实现的 第一:HTLM部分(这里不去做漂亮的样式了我们注重学习功能) <input type="file" id="fileElem" mul

HTML5时代的纯前端上传图片预览及严格图片格式验证函数(转载)

原文地址:http://www.2cto.com/kf/201401/274752.html 一.要解决什么样的问题? 在写这个函数之前,有们童鞋在群里问如何纯前端严格验证图片格式.这在html5时代之前,那是不可能实现的,必须要上传到后台,由后台脚本读取文本流后进一步验证.这样就造成了一定的服务器资源浪费.但是html5时代,这个工作我们完全可以交给前端来做了. 另一方面,html5时代,许多我们原来的图片预览方案都失效了.究其原因,其实是现代浏览器出于对用户隐私的保护,file控件不再提供真

HTML5 上传图片预览

html5出现之前如果需要上传图片预览 一般都是先上传到服务器然后远程预览 html5出现之后   有个filereader 解决了这问题 //选中图片之后 $("#fileAddPic").on('change', function (e) { var files = e.target.files || e.dataTransfer.files; onSelect(files); }) //选中图片之后 function onSelect(file) { file = file[0]

HTML5上传图片预览

笔记一下!!! <!DOCTYPE html> <html> <head> <title>HTML5上传图片预览</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <script src="http://www.codefans.net/ajaxjs/jquery-1.6.2.m