input file 实现上传预览图片,以base64上传,兼容IE8+,firefox,chrome

前言

最近在公司开发一个项目,其中涉及到一个公能,主要是上传一些小图片,而且在网站上需要大量引用这个小图片的,对于上传一些小的头像等。一开始觉得直接上传就好了,但是发现这样子的话,一个小图片就会发送一个http请求资源,大量的小图片的请求资源的话,会造成服务器资源的负担。而且我希望在用户头像上传也可以不直接上传image,以其他的方式上传,可以将图像的信息存储在数据库中,这样子对于小图片还是有好处的。经过了几天的认真思考的查找资料,自己写了一个基于jquery实现的小插件。就可以简单的实现了小图片的以base64的DATA URL 的协议上传。


基本功能

1、基于插件,可以自定义样式,预览框的大小

2、可以设置上传图片的类型,图片的大小(建议100kb以内)

3、兼容IE8+,firefox,chrom

4、以DAT URL协议实现图片上传前预览,包括图片的实际大小

5、返回上传成功或者失败的信息


代码

previewUpload.js插件代码:

;(function($){$.fn.previewUpload=function(options){/***默认选项配置**/var defaults={//预览框的样色设置'preview':{'border':'1px dashed','width':200,//必须int 'height':250,//必须int },//上传操作框样式,默认为空,不做设置'uploadImage':{},//选择图片的按钮样式'btnCss':{'display':'inline-block','line-height':'28px','font-size':'14px','text-align':'center',	'border':'1px solid #d0d0d5','border-radius':'4px','padding':'0 15px','min-width':'40px','background-color':'#fff','background-repeat':'no-repeat','background-position':'center','-webkit-transition':'border-color .15s, background-color .15s','transition':' border-color .15s, background-color .15s','outline':'0 none','cursor':'pointer','overflow':'visible','border':'1px solid #00a5e0','background-color':'#00a5e0','color':'#fff','float':'left',},//input file的样式'inputCss':{'position':'absolute','clip':'rect(0 0 0 0)',},//弹出框选择文件的类型'imageType':null,//设置图片的大小,int'imgSize':100,// 允许上传的图片格式'typeAllow':'jpeg,jpg,png,gif',// 定义选择文件时,弹出框文件显示类型,默认是所有图片'acceptType':'image/*',//读取base64编码的图片数据'imgblod':null,// ajax异步提交的数据的url'url':null,// 从php返回html元素的最外层id/***eg:<span id="resinfo"><font color=green>上传成功</font></span>*/'infoid':'resinfo',//设置返回信息在页面显示的实际时间'statTime':2000}/***继承覆盖默认配置**/var config=$.extend(defaults,options);config.sizeWarming='图片太大,请选择小于'+config.imgSize+'kb的图片';config.typeWarming='您上传的图片格式不正确,请重新选择!';config.browerWarming='浏览器版本太低';/***实例化对象this*将this赋值全局的变量*/var previewUploadDiv=$(this);/***动态创建html元素**/var previewImage,uploadImage,imgTips;previewImage='<div class="previewImage" id="localImag"><img src="" id="preview"></div>';uploadImage='<div class="uploadImage" style="margin-top:5px;">\<label class="btn-select-img" for="img" >选择图片</label>\<form id="imgform" method="post" action='+config.url+'>\<input type="file" id="img" name="myimg">\</form>\<button class="btn btn-sm btn-info btn-upload-img" style="margin-left:20px;">上传</button>\<span class="imgsizespan"></span>\</div>';imgTips='<div class="imgTips"style="float:left">小于'+config.imgSize+'kb的'+config.typeAllow+'</div>';/***添加append*/previewUploadDiv.append(previewImage+uploadImage+imgTips);/***设置样式**///预览框样式previewUploadDiv.find('div.previewImage').css(config.preview);//上传操作按钮框上传图片按钮样式的样式previewUploadDiv.find('div.uploadImage').css(config.uploadImage);/**上传图片按钮样式*鼠标移动样式**/previewUploadDiv.find('div.uploadImage label.btn-select-img').css(config.btnCss).mouseover(function(){$(this).css({'background-color':'#00b4f5','border-color': '#00b4f5','color':'#fff'});}).mouseout(function(){$(this).css(config.btnCss);});/**input file的框的样式,主要是将该框隐藏透明掉*同时指定浏览器接受的文件类型,即选择文件弹出框的符合的文件**/previewUploadDiv.find('input#img').css(config.inputCss).attr('accept',config.acceptType);/***图片预览函数**/function setImagePreview(){//获取图片对象var imgObj=document.getElementById("img");// 获取预览框对象var imgObjPreview=document.getElementById("preview");//判断获取的对象是否存在,chrom和firefoxif(imgObj.files && imgObj.files[0]){// 检查大小和格式var valid=checkSize(imgObj);if(valid){//火狐下,直接设img属性imgObjPreview.style.display = 'block';//火狐下,width,height要有单位'px'imgObjPreview.style.width = (config.preview.width-2)+'px';imgObjPreview.style.height = (config.preview.height-2)+'px';// imgObjPreview.src = docObj.files[0].getAsDataURL(imgObj.files[0]);//判断浏览器的内核类别var URL = window.URL || window.webkitURL; var objURL=URL.createObjectURL(imgObj.files[0]);//html5中的FileReader,将读取图片以base64的编码数据var reader = new FileReader();//DATA URL 协议读取base64编码数据// 格式:data:image/gif;base64,......reader.readAsDataURL(imgObj.files[0]);//读取数据完成,触发一次事件函数if(imgObjPreview.src = objURL){/**每次调用createObjectURL的时候,一个新的URL对象就被创建了.*即使你已经为同一个文件创建过一个URL. *如果你不再需要这个对象,要释放它,需要使用URL.revokeObjectURL()方法.*当页面被关闭,浏览器会自动释放它,但是为了最佳性能和内存使用,当确保不再用得到它的时候,就应该释放它.*///等图片加载完毕,再释放内存imgObjPreview.οnlοad=function(){URL.revokeObjectURL(objURL);}//读取完图片数据触发时间执行reader.onload = function(){ // 将读取的base64数据赋值配置的全局变量config.imgblod=this.result;}}else{reader.onload = function(){// 将读取的base64数据赋值配置的全局变量config.imgblod=this.result;imgObjPreview.src=this.result;}}}else{return false;}			 }else{//IE下,使用滤镜imgObj.select();imgObj.blur();//获取文本内容值,在IE中input type=file 选择文件之后input显示的是文件在本地的路径var imgSrc = document.selection.createRange().text;var localImagId = document.getElementById("localImag");//必须设置初始大小localImagId.style.width =config.preview.width-2;localImagId.style.height =config.preview.height-2;//判断格式 var imgType=imgSrc.split('.')[1];if(config.typeAllow.indexOf(imgType)==-1){// config.ievolid=0;alert(config.typeWarming);return false;}//获取图片大小var img=new Image();img.src=imgSrc;// 图片加载完毕执行img.οnlοad=function(e){var imgSize=Math.ceil(img.fileSize/1024);if(imgSize>config.imgSize){img=null;alert(config.sizeWarming);return false;}else{//将图片显示在预览框try{localImagId.style.filter="progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=scale)";localImagId.filters.item("DXImageTransform.Microsoft.AlphaImageLoader").src = imgSrc;previewUploadDiv.find('span.imgsizespan').text(imgSize+'kb');}catch(e){alert(config.typeWarming);return false;}imgObjPreview.style.display ='none';document.selection.empty();return ;	}}}return true;}/***限制上传图片的大小和格式*firefox和chrome*/function checkSize(imgObj){var imgSize,imgType;if(imgObj.files && imgObj.files[0]){// 单位字节->kbimgSize=Math.ceil(imgObj.files[0]['size']/1024);//图片类型imgType=imgObj.files[0]['type'].split('/')[1];// 大小比较if(imgSize>config.imgSize){alert(config.sizeWarming);return false;}//判断类型 if(config.typeAllow.indexOf(imgType)==-1){alert(config.typeWarming);return false;}previewUploadDiv.find('span.imgsizespan').text(imgSize+'kb');return true;}else{return true;}}/***ajax异步将数据post服务端**/function ajaxpost(){previewUploadDiv.find('button.btn-upload-img').text('正在保存');//支持html5的浏览器,IE9+if(config.imgblod){/***ajax异步提交数据**/$.post(config.url,{'base64Data':config.imgblod,'type':'base64'},function(data){if(data){previewUploadDiv.find('button.btn-upload-img').text('上传');previewUploadDiv.find('span.imgsizespan').html(data);//启动一个异步定时器setTimeout(function(){previewUploadDiv.find('span.imgsizespan').empty();},config.statTime);}});/**IE8以下的浏览器*只能将图片上传,再进行base641编码**/}else{//先移除iframepreviewUploadDiv.find('iframe#uploadiframe').remove();//动态创建form表单上传属性previewUploadDiv.find('form#imgform').attr('enctype','multipart/form-data').attr("encoding", "multipart/form-data").attr('target','uploadiframe');var iframeDiv = document.createElement('div');iframeDiv.className='iframeDiv';iframeDiv.innerHTML='<iframe id="uploadiframe" name="uploadiframe" style="display:none"></iframe>';previewUploadDiv.append(iframeDiv);//立即执行回调函数(function(callback){//表单提交上传previewUploadDiv.find('form#imgform').submit();//setInterval() 方法返回的id句柄config.timeid=setInterval(callback,200);})(function(){//ie特有document.allif(document.all){var content=document.getElementById('uploadiframe').contentDocument.getElementById(config.infoid).innerHTML;if(content){previewUploadDiv.find('button.btn-upload-img').text('上传');previewUploadDiv.find('span.imgsizespan').html(content);//启动一个异步定时器setTimeout(function(){previewUploadDiv.find('span.imgsizespan').empty();},config.statTime);//关闭setInterval()循环函数window.clearInterval(config.timeid);}				}});}}/***监听input file的文件图片是否改变**/// juqery1.8低版本存在live(),jquery1.9+移除live(),用on()函数if(previewUploadDiv.find('input#img').live){previewUploadDiv.find('input#img').live('change',setImagePreview);}else{previewUploadDiv.find('input#img').on('change',setImagePreview);}/***监听是否上传**/if(previewUploadDiv.find('button.btn-upload-img').live){previewUploadDiv.find('button.btn-upload-img').live('click',ajaxpost);}else{previewUploadDiv.find('button.btn-upload-img').on('click',ajaxpost);}}
})(jQuery);
上面的代码里面有一些可能一下子无法理解,建议查找一下资料。

html的代码:首先引入boostrap.min.css和jquery.js和上面的previewUpload.js文件

<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>By:DragonDean</title>
<link rel="stylesheet" type="text/css" href="bootstrap.min.css">
<script type="text/javascript" src="jquery-1.11.0.min.js"></script>
<script type="text/javascript" src="previewUpload.js"></script>
</head>
<body>
<div class="main" style="margin:0 auto;width:230px;height:350px;border:1px solid;padding:5px;" >	
</div>
</body>
</html>
<script type="text/javascript">$('div.main').previewUpload({//预览框的样色设置'preview':{'margin':'0 auto','border':'1px dashed','width':220,//必须int 'height':250,//必须int},//弹出框选择文件的类型'url':'test.php','imgSize':20000});
</script>
可以看到html,用法很简单,实例化一个jquery的对象即可,下面的自定义配置需要根据previewUpload.js的defaults的配置的key对应配置,就可以设置自己的需要参数。


php代码

<?php
header('Content-type:text/html;charset=utf-8');/***firefox,chrom IE9+*post过来的已经是base64字符编码*/if(isset($_POST['type']) && $_POST['type']!=''){$base64_image_content=$_POST['base64Data'];/***do something*/}/***IE8以下版本的只能上传图片,再用php编码base64*/else{if(is_uploaded_file($_FILES['myimg']['tmp_name'])){$image_info = getimagesize($_FILES['myimg']['tmp_name']);$base64_image_content = "data:{$image_info['mime']};base64," . chunk_split(base64_encode(file_get_contents($_FILES['myimg']['tmp_name'])));/***do something*/}}// 返回if($base64_image_content){echo '<span id="resinfo"><font color=green>上传成功</font></span>';}else{echo '<span  id="resinfo"><font color=red>上传失败</font></span>';}?>
php服务端就简单点,我这里直接获取post的数据就直接返回了,还需要做一下类型的判断和大小的判断,最后也可以将base64数据保存在数据库里,可以继续拓展。

效果图

1、初始化的显示


2、点击“选择图片”可以预览,点击"上传"可以上传图片,同时显示图片的大小








本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/70848.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于微信内置浏览器,打开图片上传功能,调用的问题

关于微信内置浏览器&#xff0c;打开图片上传功能&#xff0c;调用的问题 前段时间&#xff0c;项目完结测试的时候&#xff0c;同事打开魅族手机测试&#xff0c;无意中发现一个奇葩的问题&#xff01; 描述&#xff1a; 显示的是文件系统&#xff0c;列表式的&#xff0c;没有…

A-Level化学例题解析及练习

今日知识点&#xff1a;Ionisation energy and valence electrons 例题 The table gives the successive ionisation energies for an element X. What could be the formula of the chloride of X A XCl B XCl2 C XCl3 D XCl4 解析 Answer: C Definition of…

一枚Android 短信小偷 病毒的分析

一、样本简介 样本来自于吾爱破解论坛链接地址为http://www.52pojie.cn/thread-410238-1-1.html&#xff0c;样本不是很复杂有空就分析了一下。Android病毒样本还是很有意思的&#xff0c;有需要分析的样本发到论坛分析分析。 二、样本信息 文件名称&#xff1a;10086.apk …

编程确定小偷

已知A、B、C、D四个人中有一人是小偷&#xff0c;并且&#xff0c;这四个人中每人要么说真话&#xff0c;要么说假话。在审问过程中&#xff0c;这四个人分别回答如下&#xff1a; A说&#xff1a;B没有偷&#xff0c;是D偷的。 B说&#xff1a;我没有偷&#xff0c;是C偷的。 …

【笔记】根据公交卡出行记录识别小偷

案例来源&#xff1a;Bowen Du 案例地址&#xff1a;http://www.kdd.org/kdd2016/papers/files/adf0629-duA.pdf &#xff08;以下为案例的简要概述&#xff0c;便于之后能快速检索到相关内容。部分文字与图片可能直接来自原文&#xff0c;如有侵权请告知&#xff0c;谢谢&…

小偷-守卫博弈:“诡异”的纳什均衡

目录 1.什么是小偷-守卫博弈&#xff1f; 2.用数学刻画博弈信息 3.我是小偷&#xff01; 4.我是守卫&#xff01; 5.尬住了。。。 6.一个感性的认识&#xff08;给参数赋些值&#xff09; 7.纯策略&#xff1f;混合策略&#xff01; 8.混合策略纳什均衡求解 9.结论&am…

C++实现U盘小偷(超详细版)

文章目录 前言一、程序演示二、项目下载三、源代码四、代码解析1.main函数2.RegisterGlobalKey与UnRegistreGlobalKey函数3.DealMsg函数4.FindDriver函数5.ThrToSearch线程搜索函数6.ThrToCopy线程拷贝函数7.FindAllFile函数 前言 对于C/C学习感兴趣的小伙伴&#xff0c;可以看…

一个简单的动态规划问题---小偷案例

Java算法训练—小偷案例 文章目录 Java算法训练---小偷案例 前言一、案例描述二、问题分析三、代码示例总结 前言 动态规划是一种算法技巧&#xff0c;先举一个例子&#xff1a;   如何让一个四岁的小孩理解动态规划的思路&#xff1f;国外友人有这样一个例子&#xff1a;列…

Python编程判断谁是小偷

谁是小偷 ‎小区发生盗窃案&#xff0c;有四个人嫌疑最大&#xff0c;警察找来讯问。‌ ‎A说&#xff1a;不是我。‌ ‎B说&#xff1a;是C。‌ ‎C说&#xff1a;是D。‌ ‎D说&#xff1a;他冤枉人。‌ ‎四人中有一人说了假话&#xff0c;编程分析谁是小偷。 此题主要…

焦耳小偷工作原理分析

当开关闭合&#xff0c;Q1获得基极电流导通&#xff0c;右侧线圈流过电流&#xff0c;由于同名端的关系其在左侧线圈产生的互感电动势上负下正&#xff0c;正反馈使得Q1迅速饱和导通。右侧电流处于饱和状态&#xff0c;感应电动势消失&#xff0c;互感电动势也消失。互感电动势…

c语言四个人中有一个人是小偷,、甲,乙,丙,丁四个人中有一个人是小偷,请根据四个人的谈话判断谁是小偷?已知四个人中有一个人说假话...

、甲,乙,丙,丁四个人中有一个人是小偷,请根据四个人的谈话判断谁是小偷?已知四个人中有一个人说假话 关注:65 答案:5 mip版 解决时间 2021-01-31 07:52 提问者酒瘾渼亽兒 2021-01-30 16:58 、甲,乙,丙,丁四个人中有一个人是小偷,请根据四个人的谈话判断谁是小偷?已…

推理题-谁是小偷?

警察抓住了A、B、C、D四名盗窃嫌疑犯&#xff0c;其中只有一人是小偷。在审问时&#xff0c; A说&#xff1a;“我不是小偷”&#xff1b; B说&#xff1a;“C是小偷”&#xff1b; C说&#xff1a;“小偷肯定是D”&#xff1b; D说&#xff1a;“C在冤枉好人”。 现在已经…

饥荒联机版专用服务器怎么修改小偷包,饥荒联机小偷背包代码 | 手游网游页游攻略大全...

发布时间&#xff1a;2016-08-14 饥荒海难小偷背包获得方法?饥荒失落之船刷小偷背包图文教程,饥荒海难里的小偷背包是格子最多的背包了,相信很多玩家都想拥有,但是小偷背包却不是那么好拿的,今天小编就为大家带来一套饥荒海难刷小偷背包图文教程,希望对大家有所帮助 ... 标签&…

【Multisim仿真】焦耳小偷电路仿真实验

【Multisim仿真】焦耳小偷电路仿真实验 Multisim仿真 本实验仿真平台&#xff1a;Multisim14 基本电路 仿真前的相关设置选项 变压器参数设置主副线圈绕组比例调整比例&#xff1a;10:10 铁芯设置选项&#xff1a; ###对变压器输出绕组端的电压进行瞬态电压进行捕捉 设置…

深度优先遍历算法-01小偷偷东西问题

小偷偷东西问题 前言 深度优先遍历是经典的图论算法&#xff0c;深度优先遍历算法的搜索逻辑和它的名字一样&#xff0c;只要有可能&#xff0c;就尽量深入搜索&#xff0c;直到找到答案&#xff0c;或者尝试了所有可能后确定没有解。简单来说&#xff0c;深度优先遍历就是按照…

百家云在人工智能领域再有新动作,发布应用于多个行业的AIGC解决方案

4月17日消息&#xff0c;音视频SaaS上市公司百家云&#xff08;股票代码&#xff1a;RTC&#xff09;今日宣布&#xff0c;公司将正式推出应用于多个垂直行业及场景的人工智能生成内容及视频解决方案。 百家云总裁马义表示&#xff0c;此次发布的解决方案&#xff0c;将在极短…

可以远程连接服务器,但是无法ping通问题

右键电脑&#xff0c;找到管理 在服务器管理里找到配置项 在配置项里找到 高级安全windows防火墙 在高级安全windows防火墙里&#xff0c;找到&#xff0c;按如下图示&#xff0c;找到“文件和打印机共享&#xff08;回显请求-ICMPv4-in&#xff09;双击。此时图片状态默…

解决连接vcenter (客户端无法向服务器发送完整的请求。(基础连接已经关闭:发送时发生错误。)) 问题...

vCenter版本 5.5 vCenter 安装在server 2008 r2上面&#xff0c;今天补丁一打&#xff0c;重启后就无法连接vcenter了&#xff0c;起初以为是补丁的问题导致vcenter工作不正常&#xff0c;卸载了补丁依旧无法正常连接。 报未知连接错误&#xff0c;&#xff08;客户端无法向服务…

微信提示已连接到服务器失败,微信提示无法连接到服务器如何解决

近来发现不少网友对于微信提示无法连接到服务器如何解决这方面的讯息关注的热度颇高的&#xff0c;那么小编今天就针对此微信提示无法连接到服务器如何解决收集了一些相关的讯息 希望小编收集的这些讯息 能帮助到你。 1、更换接入点,重新连接网络&#xff1a; 2、单击手机上的M…

新手安装postgreSQL后无法连接服务器

2019独角兽企业重金招聘Python工程师标准>>> 系统&#xff1a;Linux Deepin 15.1 postgreSQL&#xff1a;9.5.1 pgAdmin Ⅲ&#xff1a;1.22.0 使用新立得安装postgreSQL和pgAdminⅢ之后&#xff0c;打开pgAdmin需新建服务器。 打开新建服务器窗口后&#xff0c;名称…