技术成就梦想

知道用户需求,做到专注!c#,donet,Frameworks,UML,面向对象,设计模式!
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

上传图片客户端预览及大小判断,支持IE火狐

Posted on 2010-03-19 18:05  我不是高手  阅读(1472)  评论(0编辑  收藏  举报

    做web开发的哥们都会遇到批量上传图片的需求,相信大家都会遇到这样的问题,当选择好要上传的图片,提交服务器后,发现有图片的大小超过了系统允许的范围。从而不得不返回来重新上传过;就算是那些没有超过大小的也要重新在选择一遍。上传一张还好,要是批量上传10、或者20等等,而只因为其中一张图片的大小超过了系统允许的范围,结果就又要重新选择,这个时候人的心情就可想而知了,——这真是“一颗老鼠屎坏了一锅粥”。而且也严重影响了用户体验!

     难道就没有一个好的方法吗?能在客户端就能验证用户上传的图片的大小,使用户每选择一个要上传的图片,就能知道该图片是否符合,能让用户及时地“知错能改”!这样就可以把“错误”扼杀在“萌芽”状态。这样是不是用户体验也更上一层楼了啊!好了,废话不说了,直接切入主题吧!

   客户端验证图片的大小,大家可能会想到js中的FileSystemObject 对象,诚然,该对象可以对本地文件系统进行访问。

代码如下(假设要访问的图片地址为C:\\picture.jpg):

var fso = new ActiveXObject("Scripting.FileSystemObject");
var file = fso.GetFile("C:\\picture.jpg");  // 获得文件对象
alert("文件大小=" + file.Size);  // 输出图片的大小(单位为字节)

      但此段代码,只能在IE中执行,在火狐中却不起作用,原因是火狐中不存在FileSystemObject 对象。而且在IE中通过此段代码去获得文件信息的时候,IE总会弹出一个脚本安全提示的框,让用户去选择。这样的话,虽然在客户端获得了上传的图片的大小,但却每次执行此段代码的时候都会弹出一个框,用户体验是不是会更糟啊!想想要是上传10个的话,那不是用户要点击“确定”10次啊!这样的话,岂不是“捡了芝麻丢了西瓜”嘛!而且还与火狐不兼容!难到就没有其他方法了吗? 在此,在下就介绍自己总结的一种能兼容IE和火狐的方法。

大家可以拷这段代码到本地测试一下(本人在IE7和火狐3.0上通过,此段代码还有预览图像的功能哦)。

 

<!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 http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>上传图片客户端预览及大小判断,支持IE火狐</title>
</head>

<body>
系统允许的大小:<input type="text" size="4" value="800" name="fileSizeLimit" id="fileSizeLimit"/> K
<input type="file" name="file1" id="file1" size="40" onchange="changeSrc(this)"/>
<img src="about:blank" id="fileChecker" alt="test"  height="180"/>  <!--巧妙之处-->

<script type="text/javascript">
 
var oFileChecker = document.getElementById("fileChecker");
   
function changeSrc(filePicker)
{
 if(window.addEventListener){ // FF


    oFileChecker.src = document.getElementById('file1').files[0].getAsDataURL();
    oFileChecker.addEventListener('load', function(){isFFCompleted(document.getElementById('file1').files[0]);}, false);
   
  }else{ // IE


   oFileChecker.src = filePicker.value;
   oFileChecker.attachEvent("onreadystatechange", function(){isIECompleted(oFileChecker);});
  }
}

function isIECompleted(fileObj){
 
 if (oFileChecker.readyState == "complete")
  {
      checkSize(fileObj);
  }
}

function isFFCompleted(fileObj){
 
  if ( oFileChecker.complete )
 {
  checkSize(fileObj);
 }
 
}
   
function checkSize(fileObj)
{
   
     var limit  = document.getElementById("fileSizeLimit").value * 1024;
   
     if (fileObj.fileSize > limit)
     {
        alert("文件太大");
       
     }
     else
     {
        alert("文件正确");
     }
}
</script>
</body>
</html>

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/rj042/archive/2009/08/15/4448298.aspx