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();" href="Javascript:commit();">注册</a></td>

  </tr>

  </table>

  </form>

  </body>

  </html>