一、原理

  分为两步:

  当上传图片的input被触发并选择本地图片之后获取要上传的图片这个对象的URL(对象URL),把对象URL赋值给事先写好的img标签的src属性即可把图片显示出来。在这里,我们需要了解Javascript里File对象、Blob对象和window.URL.createObjectURL()方法。

  1、File对象

  File对象可以用来获取某个文件的信息,还可以用来读取这个文件的内容.通常情况下,File对象是来自用户在一个input元素上选择文件后返回的FileList对象,也可以是来自由拖放操作生成的 DataTransfer对象.下面来看获取FileList对象:

<script type="text/javascript" src="jquery.js"></script>
<input id="upload" type="file">
<img id="preview" src="">
<script type="text/javascript">
    $('#upload').change(function () {
        // 获取FileList的第一个元素
        alert(document.getelementbyid('upload').files[0]);
    });
</script>

2、Blob对象

  一个Blob对象就是一个包含有只读原始数据的类文件对象.Blob对象中的数据并不一定得是JavaScript中的原生形式.File接口基于Blob,继承了Blob的功能,并且扩展支持了用户计算机上的本地文件.我们想要得到的对象URL实际上就是从Blob这个对象获取的,因为File的接口继承Blob。下面就来把Blob对象转换成URL:

<script type="text/javascript">
    var f = document.getelementbyid('upload').files[0];
    var src = window.URL.createObjectURL(f);
    document.getElementById('preview').src = src;
</script>

一个比较完整的实例

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title>HTML5 Upload</title>
    <style type="text/css">
        #destination {
            filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(true, sizingMethod=scale);
        }
    </style>

    <!--<script type="text/javascript" src="http://code.jquery.com/jquery-1.8.2.min.js"></script>-->
    <script type="text/javascript" src="http://localhost/jQuery/jquery.js"></script>
    <script type="text/javascript">
        //处理file input加载的图片文件
        $(document).ready(function (e) {
//判断浏览器是否有FileReader接口
            if (typeof FileReader == 'undefined') {
                $("#destination").css({'background': 'none'}).html('亲,您的浏览器还不支持HTML5的FileReader接口,无法使用图片本地预览,请更新浏览器获得最好体验');
//如果浏览器是ie
                if ($.browser.msie === true) {
//ie6直接用file input的value值本地预览
                    if ($.browser.version == 6) {
                        $("#imgUpload").change(function (event) {
//ie6下怎么做图片格式判断?
                            var src = event.target.value;
//var src = document.selection.createRange().text; //选中后 selection对象就产生了 这个对象只适合ie
                            var img = '<img src="' + src + '" width="200px" height="200px" />';
                            $("#destination").empty().append(img);
                        });
                    }
//ie7,8使用滤镜本地预览
                    else if ($.browser.version == 7 || $.browser.version == 8) {
                        $("#imgUpload").change(function (event) {
                            $(event.target).select();
                            var src = document.selection.createRange().text;
                            var dom = document.getElementById('destination');
//使用滤镜 成功率高
                            dom.filters.item('DXImageTransform.Microsoft.AlphaImageLoader').src = src;
                            dom.innerHTML = '';
//使用和ie6相同的方式 设置src为绝对路径的方式 有些图片无法显示 效果没有使用滤镜好
                            /*var img = '<img src="'+src+'" width="200px" height="200px" />';
                             $("#destination").empty().append(img);*/
                        });
                    }
                }
//如果是不支持FileReader接口的低版本firefox 可以用getAsDataURL接口
                else if ($.browser.mozilla === true) {
                    $("#imgUpload").change(function (event) {
//firefox2.0没有event.target.files这个属性 就像ie6那样使用value值 但是firefox2.0不支持绝对路径嵌入图片 放弃firefox2.0
//firefox3.0开始具备event.target.files这个属性 并且开始支持getAsDataURL()这个接口 一直到firefox7.0结束 不过以后都可以用HTML5的FileReader接口了
                        if (event.target.files) {
//console.log(event.target.files);
                            for (var i = 0; i < event.target.files.length; i++) {
                                var img = '<img src="' + event.target.files.item(i).getAsDataURL() + '" width="200px" height="200px"/>';
                                $("#destination").empty().append(img);
                            }
                        }
                        else {
//console.log(event.target.value);
//$("#imgPreview").attr({'src':event.target.value});
                        }
                    });
                }
            }
            else {
// version 1
                /*$("#imgUpload").change(function(e){
                 var file = e.target.files[0];
                 var fReader = new FileReader();
                 //console.log(fReader);
                 //console.log(file);
                 fReader.onload=(function(var_file)
                 {
                 return function(e)
                 {
                 $("#imgPreview").attr({'src':e.target.result,'alt':var_file.name});
                 }
                 })(file);
                 fReader.readAsDataURL(file);
                 });*/

//单图上传 version 2
                /*$("#imgUpload").change(function(e){
                 var file = e.target.files[0];
                 var reader = new FileReader();
                 reader.onload = function(e){
                 //displayImage($('bd'),e.target.result);
                 //alert('load');
                 $("#imgPreview").attr({'src':e.target.result});
                 }
                 reader.readAsDataURL(file);
                 });*/
//多图上传 input file控件里指定multiple属性 e.target是dom类型
                $("#imgUpload").change(function (e) {
                    for (var i = 0; i < e.target.files.length; i++) {
                        var file = e.target.files.item(i);
//允许文件MIME类型 也可以在input标签中指定accept属性
//console.log(/^image/.*$/i.test(file.type));
                        if (!(/^image/.*$ / i.test(file.type)
                    ))
                        {
                            continue; //不是图片 就跳出这一次循环
                        }

//实例化FileReader API
                        var freader = new FileReader();
                        freader.readAsDataURL(file);
                        freader.onload = function (e) {
                            var img = '<img src="' + e.target.result + '" width="200px" height="200px"/>';
                            $("#destination").empty().append(img);
                        }
                    }
                });

//处理图片拖拽的代码
                var destDom = document.getElementById('destination');
                destDom.addEventListener('dragover', function (event) {
                    event.stopPropagation();
                    event.preventDefault();
                }, false);

                destDom.addEventListener('drop', function (event) {
                    event.stopPropagation();
                    event.preventDefault();
                    var img_file = event.dataTransfer.files.item(0); //获取拖拽过来的文件信息 暂时取一个
//console.log(event.dataTransfer.files.item(0).type);
                    if (!(/^image/.*$ /
                    .
                    test(img_file.type)
                    ))
                    {
                        alert('您还未拖拽任何图片过来,或者您拖拽的不是图片文件');
                        return false;
                    }
                    fReader = new FileReader();
                    fReader.readAsDataURL(img_file);
                    fReader.onload = function (event) {
                        destDom.innerHTML = '';
                        destDom.innerHTML = '<img src="' + event.target.result + '" width="200px" height="200px"/>';
                    };
                }, false);
            }
        });
    </script>
</head>

<body>
<input type="file" id="imgUpload" name="imgUpload" draggable="true" single/> <!--允许file控件接受的文件类型-->
<!--<input type="file" id="imgUpload" name="imgUpload" accept="image/*" multiple/>-->
<div id="destination" style="width:200px;height:200px;border:1px solid #000000;"><img src="nopic.jpg"/></div>
</body>
</html>

二、兼容性

  上述方法适用于chrome浏览器

  如果是IE浏览器可以直接使用input的value来代替src

  网上查看资料有直接使用File对象的getAsDataURL()方法获取URL的,现在这个方法都已经废除,类似的还有getAsText()和getAsBinary()方法;

基于jquery实现图片上传本地预览功能的更多相关文章

  1. JQuery插件:图片上传本地预览插件,改进案例一则。

    /* *名称:图片上传本地预览插件 v1.1 *作者:周祥 *时间:2013年11月26日 *介绍:基于JQUERY扩展,图片上传预览插件 目前兼容浏览器(IE 谷歌 火狐) 不支持safari *插 ...

  2. 图片上传本地预览。兼容IE7+

    基于JQUERY扩展,图片上传预览插件 目前兼容浏览器(IE 谷歌 火狐) 不支持safari 预览地址:http://www.jinbanmen.com/test/1.html js代码:/**名称 ...

  3. js实现图片上传本地预览

    演示地址:https://xibushijie.github.io/static/uploadImg.html <!DOCTYPE> <html> <head> & ...

  4. 一、简单的图片上传并预览功能input[file]

    一.简单的图片上传并预览功能input[file] <!DOCTYPE html> <html lang="en"> <head> <me ...

  5. jquery 图片上传本地预览V1.2

    基于JQUERY扩展,图片上传预览插件 目前兼容浏览器(IE 谷歌 火狐) 不支持safari 代码进行小小的压缩 如果看源码 自己解压就行了 版本已升级  修复jquery版本问题  支持任意jqu ...

  6. input file实现多选,限制文件上传类型,图片上传前预览功能

    限制上传类型 & 多选:① accept 属性只能与 <input type="file" /> 配合使用.它规定能够通过文件上传进行提交的文件类型. ② mu ...

  7. 原生JS实现图片上传并预览功能

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. ThinkPHP5与JQuery实现图片上传和预览效果

    内容正文 这篇文章主要为大家详细介绍了thinkphp上传图片功能,和jquery预览图片效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 先上效果图: html和js代码如下: <!DO ...

  9. HTML5图片上传本地预览

    在开发 H5 应用的时候碰到一个问题,应用只需要一张小的缩略图,而用户用手机上传的确是一张大图,手机摄像机拍的图片好几 M,这可要浪费很多流量. 我们可以通过以下方式来解决. 获取图片 通过 File ...

随机推荐

  1. 健壮的 Java 基准测试

    健壮的 Java 基准测试 健壮的 Java 基准测试,第 1 部分: 问题 了解 Java 代码基准测试的问题 Brent Boyer, 程序员, Elliptic Group, Inc. 简介:程 ...

  2. 2016.9.15初中部上午NOIP普及组比赛总结

    2016.9.15初中部上午NOIP普及组比赛总结 2016.09.15[初中部 NOIP普及组 ]模拟赛 又翻车了!表示时超和空超很可恨! 进度 比赛:AC+0+0+20=120 改题:AC+80+ ...

  3. Duilib 入门教程: 怎么创建一个自定义的窗口

    一直想找一个好用UI 界面库,看过Direct UI,也想过 金山的界面库,后来找到了这个Duilib 现在的软件界面很多都是利用XML 来布局和定位. 像迅雷7,QQ,金山卫士等 [html] vi ...

  4. JavaSE_12_Properties类和缓冲流

    1.Properties类 java.util.Properties 继承于Hashtable ,来表示一个持久的属性集.它使用键值结构存储数据,每个键及其对应值都是一个字符串.该类也被许多Java类 ...

  5. 纯CSS样式写刘海屏效果

    1. 效果: 2. 代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...

  6. ES6数组对象新增方法

    1. Array.from() Array.from方法用于将两类对象转为真正的数组:类数组的对象( array-like object )和可遍历( iterable )的对象(包括 ES6 新增的 ...

  7. Git婴幼儿使用手册【十分钟让你帅气的使用命令行和团队工作】

    Git由来:...... Git使用的好处:...... 如何使用Git:(以上会显得我们以下的是很纯纯的干货) 代码库有两个部分: 本地代码库:远程代码库: 本地代码库使用方法: 一.先创建一个文件 ...

  8. java 获取本机所有IP地址

    import java.net.Inet6Address; import java.net.InetAddress; import java.net.NetworkInterface; import ...

  9. java.io.FileNotFoundException: E:\work\work (拒绝访问。)

    转载自:https://blog.csdn.net/YQS_Love/article/details/51959776 一.问题 在使用FileInputStream或FileOutputStream ...

  10. Spark-内存管理调优

    这篇文章主要是对官网内容学习过程的总结,大部分是原文,加上自己的学习笔记!!! spark 2.0+内存模型 调优内存使用时需要考虑三个因素: 对象使用的内存数量(您可能希望您的整个数据集都能装入内存 ...