Javascript 验证上传图片大小[客户端]


Posted in Javascript onAugust 01, 2009

需求分析:
在做上传图片的时候,如果不限制上传图片大小,后果非常的严重。那么我们怎样才可以解决一个棘手的问题呢?有两种方式:
1)后台处理: 也就是AJAX POST提交到后台,把图片上传到服务器上,然后获得该图片大小做处理。
2)前台处理: 也就是利用Javascript获取该图片大小。
显然第一种方式,很不好。因为需要把文件先上传到服务器上,如果文件很大的话,在加上网不是很快,需要等待好长时间,治标不治本。
功能解析:
在这里我只介绍IE与FireFox两个浏览器的不同做法。
IE6:
关键字: fileSize onreadystatechange complete
在IE6中可以通过Img对象的fileSize 属性获得文件大小,但这个fileSize属性的正确值是建立在onreadystatechange 事件的complete 中,也就是

<img src="" class="img" 
onreadystatechange="Javascript:sizeCheck(this);"> 
function sizeCheck(img) { if(img.readyState == "complete") { 
alert(img.fileSize); 
} 
} 

FireFox3.0:
关键字: getAsDataURL() fileSize
在FireFox中处于安全的考虑,无法获得上传图片的完整路径,只能获得图片名称。但浏览器提供nsIDOMFile??右??接口,所以需要通过getAsDataURL()获得处理过后的路径,但该路径不影响图片src显示。
nsIDOMFile接口:
DOMString getAsBinary();
DOMString getAsDataURL();
DOMString getAsText(in DOMString encoding);
<input type="file" name="uploadImg" 
onchange="Javascript:checkFileChange(this);" 
size="12"/> 
function checkFileChange(obj) { 
var img = document.getElementById("img"); 
img.src = obj.files[0].getAsDataUrl(); 
alert(obj.files[0].fileSize); 
}

以上是两个不同浏览器的处理方式,那么怎么把他们融和到一起呢?我在下面会将我做的小例子贴出来,其中里面我使用JQuery,方便与获取对象。
<!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" xml:lang="zh" lang="zh" dir="ltr"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<script type="text/javascript" src="lib/jquery-1.3.2.min.js" ></script> 
<title>检查上传图片大小</title> 
<style type="text/css"> 
.img {width:136px;height:102px;} 
.imgError{border:3px solid red;} 
</style> 
<script type="text/javascript"> 
//限制上传图片大小100K 
var MAXSIZE = 100 * 1024; //图片大小限制信息 
var ERROR_IMGSIZE = "图片大小不能超过100K"; 
//默认图片 
var NOPHOTO = "imgs/nophoto.gif"; 
//图片是否合格 
var isImg = true; 
/** 
* Input file onchange事件 
* @params obj file对象 
* @return void 
**/ 
function checkFileChange(obj) { 
//初始化设置 
$(".imgTable").removeClass("imgError"); 
updateTips(""); 
var img = $(".img").get(0); 
var file = obj.value; 
var exp = /.\.jpg|.\.gif|.\.png|.\.bmp/i; 
if (exp.test(file)) {//验证格式 
if($.browser.msie) {//判断是否是IE 
img.src = file; 
} else { 
img.src = obj.files[0].getAsDataURL(); 
sizeCheck(img); 
} 
} else { 
img.src = NOPHOTO; 
$(".imgTable").addClass("imgError"); 
updateTips("图片格式不正确"); 
isImg = false; 
} 
} 
/** 
* sizeCheck 检查图片大小 
* @params img 图片对象 
* @return void 
**/ 
function sizeCheck(img) { 
//初始化设置 
$(".imgTable").removeClass("imgError"); 
updateTips(""); 
if ($.browser.msie) {//查看是否是IE 
if(img.readyState == "complete") { 
if (img.fileSize > MAXSIZE) { 
$(".imgTable").addClass("imgError"); 
updateTips(ERROR_IMGSIZE); 
isImg = false; 
}else { 
isImg = true; 
} 
}else { 
$(".imgTable").addClass("imgError"); 
updateTips(ERROR_IMGSIZE); 
isImg = false; 
} 
} else { 
var file = $("input:file[name='uploadImg']")[0]; 
if (file.files[0].fileSize > MAXSIZE) { 
$(".imgTable").addClass("imgError"); 
updateTips(ERROR_IMGSIZE); 
isImg = false; 
}else { 
isImg = true; 
} 
} 
} 
/** 
* updateTips 注册错误信息显示 
* @params str 显示内容 
* @return void 
**/ 
function updateTips(str) { 
$("p#errorTips").text(str); 
} 
/** 
* commit 注册提交 
* @return void 
**/ 
function commit() { 
var isCommit = true; 
var usrname = $("input:text[name='usrname']"), 
email = $("input:text[name='email']"), 
img = $(".img"), 
file = $("input:file[name='uploadImg']"), 
frm = document.frm; 
isCommit = isCommit && isImg; 
if(isCommit) { 
frm.action = "about:blank"; 
frm.submit(); 
} 
} 
/** 
* errorImg 图片错误显示 
* @params img 图片对象 
* @return void 
**/ 
function errorImg(img) { 
img.src = NOPHOTO; 
} 
</script> 
</head> 
<body> 
<form name="frm" method="post"> 
<p id="errorTips"> </p> 
<table cellpadding="1" cellspacing="0" width="350px" border="1"> 
<tr> 
<td><label>姓名:</label></td> 
<td><input type="text" name="usrname" maxlength="50"/></td> 
</tr> 
<tr> 
<td><label>性别:</label></td> 
<td><input type="radio" name="sex" value="0"/>男<input type="radio" name="sex" value="0"/>女</td> 
</tr> 
<tr> 
<td><label>邮件:</label></td> 
<td><input type="text" name="email" maxlength="100"/></td> 
</tr> 
<tr> 
<td><lable>图像</label></td> 
<td> 
<table cellpadding="0" cellspacing="0" class="imgTable"> 
<tr> 
<td><img src="imgs/nophoto.gif" src="imgs/nophoto.gif" class="img" alt="头像" onerror="Javascript:errorImg(this);" 
onreadystatechange="Javascript:sizeCheck(this);"/> 
</td> 
</tr> 
<tr> 
<td><input type="file" name="uploadImg" onchange="Javascript:checkFileChange(this);" 
size="12"/></td> 
</tr> 
</table> 
</td> 
</tr> 
<tr> 
<td colspan="2"><a href="Javascript:commit();" href="Javascript:commit();">注册</a></td> 
</tr> 
</table> 
</form> 
</body> 
</html>
Javascript 相关文章推荐
使图片旋转的3种解决方案
Nov 21 Javascript
JS实现固定在右下角可展开收缩DIV层的方法
Feb 13 Javascript
JQuery动态添加和删除表格行的方法
Mar 09 Javascript
javascript制作2048游戏
Mar 30 Javascript
JavaScript中日期函数的相关操作知识
Aug 03 Javascript
angularjs实现搜索的关键字在正文中高亮出来
Jun 13 Javascript
AngularJS日程表案例详解
Aug 15 Javascript
vue文件树组件使用详解
Mar 29 Javascript
微信小程序之裁剪图片成圆形的实现代码
Oct 11 Javascript
JS中实现一个下载进度条及播放进度条的代码
Jun 10 Javascript
vue实现移动端触屏拖拽功能
Aug 21 Javascript
js实现炫酷光感效果
Sep 05 Javascript
Javascript 汉字字节判断
Aug 01 #Javascript
JS 面向对象的5钟写法
Jul 31 #Javascript
Document 对象的常用方法
Jul 31 #Javascript
javascript getElementsByName()的用法说明
Jul 31 #Javascript
extjs 列表框(multiselect)的动态添加列表项的方法
Jul 31 #Javascript
JavaScript 学习小结(适合新手参考)
Jul 30 #Javascript
JavaScript 创建对象和构造类实现代码
Jul 30 #Javascript
You might like
PHP IPV6正则表达式验证代码
2010/02/16 PHP
深入PHP运行环境配置的详解
2013/06/04 PHP
js和php邮箱地址验证的实现方法
2014/01/09 PHP
php微信公众平台开发之获取用户基本信息
2015/08/17 PHP
PHP中如何使用session实现保存用户登录信息
2015/10/20 PHP
PHP中的随机性 你觉得自己幸运吗?
2016/01/22 PHP
让textarea控件的滚动条怎是位与最下方
2007/04/20 Javascript
JavaScript 快捷键设置实现代码
2009/03/13 Javascript
javascrip关于继承的小例子
2013/05/10 Javascript
改变文件域的样式实现思路同时兼容ie、firefox
2013/10/23 Javascript
js实现的全国省市二级联动下拉选择菜单完整实例
2015/08/17 Javascript
javascript实现PC网页里的拖拽效果
2016/03/14 Javascript
JS简单实现DIV相对于浏览器固定位置不变的方法
2016/06/17 Javascript
js实现弹窗居中的简单实例
2016/10/09 Javascript
Bootstrap常用组件学习(整理)
2017/03/24 Javascript
原生JS 购物车及购物页面的cookie使用方法
2017/08/21 Javascript
vue不通过路由直接获取url中参数的方法示例
2017/08/24 Javascript
jquery实现限制textarea输入字数的方法
2017/09/06 jQuery
解决vue的 v-for 循环中图片加载路径问题
2018/09/03 Javascript
浅谈Vue.js 关于页面加载完成后执行一个方法的问题
2019/04/01 Javascript
Javascript异步执行不按顺序解决方案
2020/04/30 Javascript
vue实现div可拖动位置也可改变盒子大小的原理
2020/09/16 Javascript
OpenLayers3加载常用控件使用方法详解
2020/09/25 Javascript
js+cavans实现图片滑块验证
2020/09/29 Javascript
python 穷举指定长度的密码例子
2020/04/02 Python
Python csv文件记录流程代码解析
2020/07/16 Python
Python 打印自己设计的字体的实例讲解
2021/01/04 Python
程序运行正确, 但退出时却"core dump"了,怎么回事
2014/02/19 面试题
证婚人经典证婚词
2014/01/09 职场文书
出纳工作岗位责任制
2014/02/02 职场文书
小学美术兴趣小组活动总结
2014/07/07 职场文书
临时工聘用合同协议书
2014/10/29 职场文书
2014高三学生考试作弊检讨书
2014/12/14 职场文书
2015年思想品德教学工作总结
2015/07/22 职场文书
python 中的jieba分词库
2021/11/23 Python
Python制作春联的示例代码
2022/01/22 Python