Javascript验证上传图片大小[前台处理]

需求分析:

在做上传图片的时候,如果不限制上传图片大小,后果非常的严重。那么我们怎样才可以解决一个棘手的问题呢?有两种方式:
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();" rel="external nofollow" rel="external nofollow" href="Javascript:commit();" rel="external nofollow" rel="external nofollow" >注册</a></td>
</tr>
</table>
</form>
</body>
</html>
(0)

相关推荐

  • js 图片上传前大小长宽验证代码

    脚本如下: function getimginfo() { var img=new Image(); img.src=document.all.file.value; var sInfo="Width:"+img.width+ "px Height:"+img.height+ "px Size:"+getsizestring(img.fileSize); alert(sInfo); } function getsizestring(len) {

  • 真正好用的js验证上传文件大小的简单方法

    最近使用到一个文件上传功能,发现恶意上传一个2G文件时,后台处理响应较慢,遂想到能否使用js来进行客户端的验证.但查阅网上多处资料,均使用 ActiveXObject("Scripting.FileSystemObject"); 的方法,该方法需要将Internet选项中安全级别提高,启用一个系统本身不推荐的选项,会出现如下非常不友好的提示: 所以这边并没有用到,而是寻求其他方法. 这边新的思路是img标签中的dynsrc属性. 在FireFox.Chrome浏览器中可以根据docum

  • javascript 客户端验证上传图片的大小(兼容IE和火狐)

    在我 上一篇帖子 (译文 ) 中,谈到了各个浏览器究竟会在什么情况下弹出脚本失控提示,对于Internet Explorer 来说,当浏览器执行了数量过多的语句时就会停止执行脚本,而其他的浏览器,则是持续执行脚本超过一定时间的时候就会给出提示.而我们要探讨的核心问题,不是这些浏览器如果探测失控的脚本,而是我们如何才可以让脚本运行的更快一些,从而避免这些警告 . 脚本失控基本上有以下四个方面的原因: 在循环中执行了太多的操作. 臃肿的函数体 过多的递归 过多的 DOM 调用 在这篇帖子中,我将会把

  • js验证上传图片的方法

    本文实例讲述了js验证上传图片的方法.分享给大家供大家参考.具体实现方法如下: <!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"> <hea

  • javascript验证上传文件的类型限制必须为某些格式

    复制代码 代码如下: //验证文件的格式 function validateFile(){ var fileObject=$("#filename"); var errorObject=$("#error"); var filepath=fileObject.val(); var fileArr=filepath.split("//"); var fileTArr=fileArr[fileArr.length-1].toLowerCase().s

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

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

  • Node.js开发教程之基于OnceIO框架实现文件上传和验证功能

    OnceIO 是 OnceDoc 企业内容(网盘)的底层Web框架,它可以实现模板文件.静态文件的全缓存,运行起来完全不需要I/O操作,并且支持客户端缓存优化,GZIP压缩等(只在第一次压缩),拥有非常好的性能,为您节约服务器成本.它的模块化功能,可以让你的Web进行分布式存储,即一个扩展包里即包含前端.后端和数据库定义,只需通过添加/删除目录的方式就可实现功能删减,实现真正的模块化扩展.这里是介绍如何使用OnceIO的一系列文章. 在这一章节中,我们将为大家演示如何使用 OnceIO 实现文件

  • 多个上传文件用js验证文件的格式和大小的方法(推荐)

    html部分: <dsp:form action="${originatingRequest.requestURI}" method="post" enctype="multipart/form-data"> <dsp:input type="file" bean="ReturngoodsFormHandler.uploadedFile1" id="uploadedFile1&q

  • JS简单验证上传文件类型的方法

    本文实例讲述了JS简单验证上传文件类型的方法.分享给大家供大家参考,具体如下: function checkType(){ //得到上传文件的值 var fileName=document.getElementById("file_logo").value; //返回String对象中子字符串最后出现的位置. var seat=fileName.lastIndexOf("."); //返回位于String对象中指定位置的子字符串并转换为小写. var extensi

  • 上传的js验证(图片/文件的扩展名)

    js 验证上传图片 复制代码 代码如下: var ImgObj=new Image();//建立一个图像对象 varAllImgExt=".jpg|.jpeg|.gif|.bmp|.png|"//全部图片格式类型 varFileObj,ImgFileSize,ImgWidth,ImgHeight,FileExt,ErrMsg,FileMsg,IsImg//全局变量图片相关属性 //以下为限制变量 var AllowExt=""; //允许上传的文件类型ŀ为无限制每个

随机推荐