模拟type=file;上传并预览图片

最近项目的会员中心,要做一个上传本地img并预览的效果。效果大概是这个样子。自己以前没做过;摸着石头过河总算完成了感觉有必要整理一下,写篇博客耍耍。

整体效果大概是这个样子的:

1.点击框框任何地方;弹出选择文件窗口;

2.选择后,再框框区域预览;

3.再次点击框框,更换图片。

下面说说整个实现的过程吧。

html代码的结构大概是这样的。

   <div class="imgitem secondImg">
       <div class="u-add-img-icon u-fileUploadContainer">   </div>
       <input id="fileImage2" type="file" multiple="" class="u-fileInput">
       <span class="imgcontainer"><img src=""  class="idImg"></span>
       <span class="backImg">***反面</span>
  </div>

步骤:

1.首选是要模拟type=file;点击之后选择文件的效果。

最外层的imgitem设置固定宽高,postion:realative;

然后就是加一张上传图片的图标;告诉用户可以上传预览图片

最后,input  type="file"位置绝对定位;设置透明度为0;位置刚好铺满外层的框框。这样点击框框里面任何位置就可以弹窗选择文件的框框了。

Css代码如下:

.imgitem {
  width: 240px;
  height: 160px;
  display: inline-block;
  border: 1px #d5d4d4 dotted;
  text-align: center;
  line-height: 160px;
  position: relative;//相对定位
  }
 .u-fileInput{
  width: 240px;
  height: 160px;
  overflow: hidden;
  position: absolute;
  right: 0;
  top: 0;
  opacity: 0;//透明度为0
  filter: alpha(opacity=0);;//透明度为0,兼容IE8
  cursor: pointer;
  }
  //add-img图标
  .u-add-img-icon {
  width: 74px;
  height: 61px;
  background: url(../images/member/add-img-icon.png) no-repeat;
  display: inline-block;
  vertical-align: middle;

2.选择后预览;这个地方的实现比较巧妙;因为我们知道type=file;选择文件后,选择会返回一个file对象;而createObjectURL(file)可以接受一个文件对象;并返回文件的url;然后指定img的src围着url;就可以实现预览图片了。

这个地方稍微复杂;代码如下:

首选封装了一个上传预览的小插件:叫uploadPreview

有关createObjectURL的东东,不了解的百度,看一下。不是本文的重点;略过。

/*
*名称:图片上传本地预览
*作者:贾襄俊
*时间:2015年9月11日
*介绍:基于JQUERY扩展,图片上传预览插件

*参数说明: imgObj:图片jquery对象;type:支持文件类型;callback:选择文件显示图片后回调方法;
*使用方法: 
<div>
<img id="temp"/></div>
<input type="file" id="up" />
把需要进行预览的IMG标签外 套一个DIV 然后给上传控件ID给予uploadPreview事件
$("#up").uploadPreview({ imgObj: $("#temp"), type: ["gif", "jpeg", "jpg", "bmp", "png"], callback: function () { }});
*/
jQuery.fn.extend({
    uploadPreview: function (opts) {
        var _self = this,
            _this = $(this);
        opts = jQuery.extend({
            imgObj: null,
            type: ["gif", "jpeg", "jpg", "bmp", "png"],
            callback: function () {}
        }, opts || {});
        _self.getObjectURL = function (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
        };
        _this.change(function () {
            if (this.value) {
                if(!opts.imgObj){
                    return;
                }
                if (!RegExp("\.(" + opts.type.join("|") + ")$", "i").test(this.value.toLowerCase())) {
                    alert("文件格式错误,必须是" + opts.type.join(",") + "中的一种");
                    this.value = "";
                    return false
                }
                if (document.selection) {
                    try {
                       opts.imgObj.attr(‘src‘, _self.getObjectURL(this.files[0]))
                    } catch (e) {
                        var src = "";
                        var obj = opts.imgObj;
                        var div = obj.parent("div")[0];
                        _self.select();
                        if (top != self) {
                            window.parent.document.body.focus()
                        } else {
                            _self.blur()
                        }
                        src = document.selection.createRange().text;
                        document.selection.empty();
                        obj.hide();
                        obj.parent("div").css({
                            ‘filter‘: ‘progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=scale)‘
                        });
                        div.filters.item("DXImageTransform.Microsoft.AlphaImageLoader").src = src;
                    }
                } else {
                    opts.imgObj.attr(‘src‘, _self.getObjectURL(this.files[0]))
                }
                opts.callback()
            }
        })
    }
});

然后就是input type =file的元素调用:

    //图片添加预览效果
    $(".u-fileInput").each(function(){
        var $this = $(this);
        $this.uploadPreview({imgObj:$this.next().find("img"), callback:uploadHandler});
        //获取url设置img src成功后,回调,隐藏add-icon;显示图片
        function uploadHandler() {
            $this.next().show();
            $this.prev().hide();
        }
    });

3.最后点击框框更换图片就比较简单了,这里就不多赘言了。

每天进步一点点。

时间: 2024-12-14 18:04:29

模拟type=file;上传并预览图片的相关文章

js上传和预览图片

[1].[代码] [HTML]代码 跳至 [1] <!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> <meta

plupload上传前预览图片

plupload预览图片有多种方法,主要由moxie的Image提供,Image的downsize.crop.embed都可用来预览图片 1.downsize 最开始做项目的时候,我用的就是downsize来做预览图片 downsize(opts) Downsizes the image to fit the specified width/height. If crop is supplied, image will be cropped to exact dimensions. Argume

调用微信Js-SDK上传、预览图片

$(document).ready(function(){ var url = location.href.split('#')[0]; $.get(rootPath + "/wechat/member/user/getWechatConfig?url=" + url,"",function(data){ wx.config({ debug: false, appId: data.appId, nonceStr: data.nonceStr, signature:

富文本编辑器handyeditor,上传和预览图片的host地址不一样

使用富文本编辑器(官网)时,大多时候都会用到图片上传,但是下载的富文本编辑器的默认配置是只有一个上传地址的host的. var he = HE.getEditor('editor', { autoHeight: true, autoFloat: false, topOffset: 0, uploadPhoto: true, uploadPhotoUrl: uploadDomain, uploadPhotoHandler: "", uploadPhotoSize: 200, upload

js上传并且预览图片

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <script type="text/javascript" src = "jquery.js"></script> </head> <bod

实现上传时预览图片

主要使用的类 js new FileReader 方法名 参数 描述 abort none 中断读取 readAsBinaryString file 将文件读取为二进制码 readAsDataURL file 将文件读取为 DataURL readAsText file, [encoding] 将文件读取为文本 代码 <input id="prepare" type="file" accept="" value="aaa"

HTML5 jQuery图片上传前预览

HTML5实现表单内的上传文件框,上传前预览图片,针刷新预览images,本例子主要是使用HTML5 的File API,建立一個可存取到该file的url,一个空的img标签,ID为img0,把选择的文件显示在img标签中,实现图片预览功能.请选择支持HTML API的浏览器,比如谷歌Chrome和火狐等. <!DOCTYPE html><html> <head> <title>HTML5上传图片预览</title> <meta char

【转】HTML5 jQuery图片上传前预览

hTML5实现表单内的上传文件框,上传前预览图片,针刷新预览images,本例子主要是使用HTML5 的File API,建立一個可存取到该 file的url,一个空的img标签,ID为img0,把选择的文件显示在img标签中,实现图片预览功能.请选择支持HTML API的浏览器,比如 谷歌Chrome和火狐等. <!DOCTYPE html> <html> <head> <title>HTML5上传图片预览</title> <meta h

html之file标签 --- 图片上传前预览 -- FileReader

记得以前做网站时,曾经需要实现一个图片上传到服务器前,先预览的功能.当时用html的<input type="file"/>标签一直实现不了,最后舍弃了这个标签,使用了其他方式来实现了这个功能. 今天无意发现了一个知识点,用html的file标签就能实现图片上传前预览,感觉很棒,记录一下!就是通过file标签和js的FileReader接口,把选择的图片文件调用readAsDataURL方法,把图片数据转成base64字符串形式显示在页面上. 1.闲话少说,测试一下,图片上