input file上传图片预览



下载地址http://download.csdn.net/detail/cometwo/9383602

兄弟文章:http://blog.csdn.net/libin_1/article/details/50916704


input file上传图片预览其实很简单,只是没做过的感觉很神奇,今天我就扒下她神秘的面纱,其实原理真的非常非常非常非常非常非常简单!

点击红框是加载显示图片,X号删除,蓝框是自动在后面添加添加图片框,所有的都是原创,代码其实可以更加精简,看终结版文件

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title></title>
    <script type="text/javascript" src="jquery-1.11.1.min.js"></script>

    <style type="text/css">
        .imgbox,.imgbox1
        {
            float: left;
            margin-right: 20px;
            margin-top: 20px;
            position: relative;
            width: 182px;
            height: 142px;
            border: 1px solid red;
            overflow: hidden;
        }
        .imgbox1{border: 1px solid blue;
        }

        .imgnum{
            left: 0px;
            top: 0px;
            margin: 0px;
            padding: 0px;
        }
        .imgnum input,.imgnum1 input {
            position: absolute;
            width: 182px;
            height: 142px;
            opacity: 0;
        }
        .imgnum img,.imgnum1 img {
            width: 100%;
            height: 100%;
        }
        .close,
        .close1 {
            color: red;
            position: absolute;
            left: 170px;
            top: 0px;
            display: none;
        }

    </style>
</head>

<body>
<div id="img">
<div class="imgbox">
    <div class="imgnum">
        <input type="file" class="filepath" />
        <span class="close">X</span>
        <img src="btn.png" class="img1" />
        <img src="" class="img2" />
    </div>
</div><div class="imgbox">
    <div class="imgnum">
        <input type="file" class="filepath" />
        <span class="close">X</span>
        <img src="btn.png" class="img1" />
        <img src="" class="img2" />
    </div>
</div>
<div class="imgbox">
    <div class="imgnum">
        <input type="file" class="filepath" />
        <span class="close">X</span>
        <img src="btn.png" class="img1" />
        <img src="" class="img2" />
    </div>
</div>
<div class="imgbox">
    <div class="imgnum">
        <input type="file" class="filepath" />
        <span class="close">X</span>
        <img src="btn.png" class="img1" />
        <img src="" class="img2" />
    </div>
</div>
<div class="imgbox">
    <div class="imgnum">
        <input type="file" class="filepath" />
        <span class="close">X</span>
        <img src="btn.png" class="img1" />
        <img src="" class="img2" />
    </div>
</div>
<div class="imgbox">
    <div class="imgnum">
        <input type="file" class="filepath" />
        <span class="close">X</span>
        <img src="btn.png" class="img1" />
        <img src="" class="img2" />
    </div>
</div>
<div class="imgbox">
    <div class="imgnum">
        <input type="file" class="filepath" />
        <span class="close">X</span>
        <img src="btn.png" class="img1" />
        <img src="" class="img2" />
    </div>
</div>
<div class="imgbox">
    <div class="imgnum">
        <input type="file" class="filepath" />
        <span class="close">X</span>
        <img src="btn.png" class="img1" />
        <img src="" class="img2" />
    </div>
</div>  <div class="imgbox">
    <div class="imgnum">
        <input type="file" class="filepath" />
        <span class="close">X</span>
        <img src="btn.png" class="img1" />
        <img src="" class="img2" />
    </div>
</div>

<div class="imgbox1">
    <div class="imgnum">
        <input type="file" class="filepath1" />
        <span class="close1">X</span>
        <img src="btn.png" class="img11" />
        <img src="" class="img22" />
    </div>
</div>

</div>

</body>
<script type="text/javascript">
    $(function() {
        $(".filepath").on("change",function() {
            alert($('.imgbox').length);
            var srcs = getObjectURL(this.files[0]);   //获取路径
            $(this).nextAll(".img1").hide();   //this指的是input
            $(this).nextAll(".img2").show();  //fireBUg查看第二次换图片不起做用
            $(this).nextAll('.close').show();   //this指的是input
            $(this).nextAll(".img2").attr("src",srcs);    //this指的是input
            $(this).val('');    //必须制空
            $(".close").on("click",function() {
                $(this).hide();     //this指的是span
                $(this).nextAll(".img2").hide();
                $(this).nextAll(".img1").show();
            })
        })
    })

    function getObjectURL(file) {
        var url = null;
        if (window.createObjectURL != undefined) {
            url = window.createObjectURL(file)
        } else if (window.URL != undefined) {
            url = window.URL.createObjectURL(file)
        } else if (window.webkitURL != undefined) {
            url = window.webkitURL.createObjectURL(file)
        }
        return url
    };

    $(function() {
        $("#img").on("change",".filepath1",function() {
            //alert($('.imgbox1').length);
            var srcs = getObjectURL(this.files[0]);   //获取路径
            alert(srcs);
            //this指的是input
            /* $(this).nextAll(".img22").attr("src",srcs);    //this指的是input
             $(this).nextAll(".img22").show();  //fireBUg查看第二次换图片不起做用*/
            var htmlImg='<div class="imgbox1">'+
                    '<div class="imgnum1">'+
                    '<input type="file" class="filepath1" />'+
                    '<span class="close1">X</span>'+
                    '<img src="btn.png" class="img11" />'+
                    '<img src="'+srcs+'" class="img22" />'+
                    '</div>'+
                    '</div>';

            $(this).parent().parent().before(htmlImg);
            $(this).val('');    //必须制空
            $(this).parent().parent().prev().find(".img11").hide();   //this指的是input
            $(this).parent().parent().prev().find('.close1').show();

            $(".close1").on("click",function() {
                $(this).hide();     //this指的是span
                $(this).nextAll(".img22").hide();
                $(this).nextAll(".img11").show();
                if($('.imgbox1').length>1){
                    $(this).parent().parent().remove();
                }

            })
        })
    })

</script>

</html>

问题
加入我们在 HTML 里面有一个图片上传控件:

注意这个 accept=”image/*” 非常重要,它指定了上传的是图片,在移动端的时候会关联到系统的弹窗选择类型等问题,务必加上。

然后,问题是,我们在没有提交这个表单到服务器之前,有没有办法把图片的内容读取出来呢?

看似简单,都是客户端的文件,应该是可以的,但在之前确实没什么好办法,但是自从我们有了 HTML5

例子说明问题
复制代码

$(function() {
  $('#upload_image').change(function(event) {
    // 根据这个 <input> 获取文件的 HTML5 js 对象
    var files = event.target.files, file;
    if (files && files.length > 0) {
      // 获取目前上传的文件
      file = files[0];
      // 来在控制台看看到底这个对象是什么
      console.log(file);
      // 那么我们可以做一下诸如文件大小校验的动作
      if(file.size > 1024 * 1024 * 2) {
        alert('图片大小不能超过 2MB!');
        return false;
      }
      // !!!!!!
      // 下面是关键的关键,通过这个 file 对象生成一个可用的图像 URL
      // 获取 window 的 URL 工具
      var URL = window.URL || window.webkitURL;
      // 通过 file 生成目标 url
      var imgURL = URL.createObjectURL(file);
      // 用这个 URL 产生一个 <img> 将其显示出来
      $('body').append($('<img/>').attr('src', imgURL));
      // 使用下面这句可以在内存中释放对此 url 的伺服,跑了之后那个 URL 就无效了
      // URL.revokeObjectURL(imgURL);
    }
  });
});

复制代码
简要说明
简单来说整个操作设计如下几步:

通过 的 change 事件触发事件,并且获取 event 对象;
通过 event 对象获取上传的文件的 js 对象 file ;
通过 window.URL 工具从 file 对象生成一个可用的 URL;
把这个 URL 置入使用;
*释放这个 URL 的伺服
关键点:

对于同一个 file ,每次调用 URL.createObjectURL 的时候,都会重新生成一个不同的 URL;
调用 URL.createObjectURL 的时候,浏览器自动在内存中开辟空间,用于伺服这个 URL,也就是使得这个 URL 可以请求成功;
如果调用了 URL.revokeObjectURL(imgURL); 之后,这个伺服就会关掉,再请求这个 URL 就会 404;
这一切都是客户端的事情,服务器端对此一无所知,包括你选择的这个图;
这个 imgURL 大概是这个样子:blob:http%3A//localhost%3A8000/22cc97d5-5e46-4d87-9df4-c3e8c0aa72bb

时间: 2024-09-11 07:40:58

input file上传图片预览的相关文章

javascript实现input file上传图片预览效果_javascript技巧

本文实例介绍了javascript实现input file上传图片预览效果的详细代码,分享给大家供大家参考,具体内容如下 运行效果图: 具体实现代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> <script type="text/javascript" src="jquery-1.1

js兼容火狐显示上传图片预览效果的方法

  本文实例讲述了js兼容火狐显示上传图片预览效果的方法.分享给大家供大家参考.具体实现方法如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 <!doctype html> <html> <head> <meta content="text/html; charset=GBK" http-equiv="Content-

js兼容火狐显示上传图片预览效果的方法_javascript技巧

本文实例讲述了js兼容火狐显示上传图片预览效果的方法.分享给大家供大家参考.具体实现方法如下: <!doctype html> <html> <head> <meta content="text/html; charset=GBK" http-equiv="Content-Type" /> <title>Image preview example</title> <style type=&

js实现上传图片预览的方法_javascript技巧

图片预览的 javascript 本地操作 早期浏览器,不能将本地图片作为页面元素处理,要实现图片预览需要将图片先上传到服务器,再从服务器取得进行预览 现代的浏览器功能越来越全面,因此可以实现对一些数据的本地处理 Chrome MsEdge(ie11) Firefox  上图的html <tr> <td>缩略图</td> <td> <a href="javascript::void(0)" class="fileBtn&q

JS上传图片预览插件制作(兼容到IE6)_javascript技巧

一.实现图片预览的一些方法. 了解了一下,其实方法都是大同小异的.大概有以下几种方式: ①订阅input[type=file]元素的onchange事件. 一旦选择的路径被改变就把图片上传至服务器,然后就返回图片在服务器端的地址,并且赋值到img元素上. 缺点:工作量大,有些上传并不是用户最终需要上传的图片,但是这种方式会把上传过程中选择过的图片都保存至服务器端,会造成资源浪费,而且服务器端清理临时的那些预览图片也需要一定的工作量. ②利用HTML5的新特性FileReader. 这个对象提供了

js上传图片预览代码(兼容IE、Chrome、Firefox)

我们一般根据IE6.IE7进行开发的时候写图片预览的代码是  代码如下 复制代码 document.getElementById("img").src = document.getElementById("file").value; 例子  代码如下 复制代码 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=

JS HTML5拖拽上传图片预览_javascript技巧

1.文件API:(File API) file类型的的表单控件选择的每一个文件都是一个file对象,而FileList对象则是这些file对象的集合列表,代表所选择的所有文件.file对象继承于Blob对象,该对象表示二进制原始数据,提供slice方法,可以访问到字节内部的原始数据块.总之,file对象包含与FlieList对象,而file对象继承于Blob对象! 各对象的相关属性关系: FileReader接口: 由图可知:HTML5还提供了FileReader接口:用于将文件读入内存,并读取

js 上传图片预览问题_图象特效

最近也经常遇到浏览器兼容的问题,昨天遇到上传图片预览问题,发现IE8和火狐不能显示,弄了很久,早上终于解决了很高兴.故跟大家分享下,我也多是网上找的,自己总结的一下,希望对大家有点帮助. 我们一般根据IE6.IE7进行开发的时候写图片预览的代码是: 复制代码 代码如下: document.getElementById("img").src = document.getElementById("file").value; 还有一种方式 复制代码 代码如下: <d

Extjs上传图片预览与解决无法预览

在进行图片上传时,通常需要进行预览.而这种预览的行为通常是预览客户端的本地资源.下面就讲一下在Ext中是如何实现图片上传预览的.       首先,创建为预览图片创建一个控件:    代码如下 复制代码 xtype : 'box', id : 'logoPic', width : 150, height : 200, autoEl : {     tag : 'img',     src : currentLogoPath,      style : 'filter:progid:DXImage