您的位置:首页 > 其它

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

2009-08-14 23:52 513 查看
做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上通过,此段代码还有预览图像的功能哦)。

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title></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>

只要把一上的代码稍加修改,就可以应用到大家的系统中了。此代码的巧妙之处就是额外的增加了一个IMG元素。它用于把用户选择的图片得以加载进来,从而从页面而不是从文件系统中获得此图片对象(这样浏览器也就不会弹出什么安全提示框来了)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: