用JS在上传前获取图片信息,以前做上传图片的流程是,用户把上传(异步或者常规表单提交)后,用服务端脚本(如php)获得图片信息如
但是现在有一个要求是在用户上传前预览,并判断图片的尺寸,大小和文件类型,如果不正常则返回相应的错误信息。这样比用户上传后才能预览来说体验会更好,同时也能节约服务器的带宽和空间。
以前看过类似的效果,在爱乐活的个人头像编辑上,能做到上传前的预览,不过那是用flash做的,不会flash, 只能js做了。
没有整理,代码比较粗糙和凌乱,只为了方便自己以后实现类似的效果,在ie和非ie浏览器有很多不同的处理,在经验的程序员应该可以看得懂。
(这里的限制为只能上传64X64的PNG图片,部分判断语句不严谨过这不是关键,众所周知,因为安全问题,文件上传最后还是需要服务端验证的。)
以下为文件的代码:
upload.html
上载文件表单
预览区:
upload.js
function checkSize(){
var f=document.getElementById("doc");
if(ie){
var img=new Image();//动态创建img
img.src=f.value;
img.id="temp_img";
//img.style.display="none";
document.body.appendChild(img);
alert(img.width);
img.onreadystatechange=function(){
if(img.readyState=='complete'){//当图片load完毕
//alert(img.width);
//alert(img.fileSize);//ie获取文件大小
}
}
//document.body.removeChlid(img);//获取大小结束,移除图片
}
else{
var fv=f.files[0].size;//火狐等标准取值办法
alert(fv);
}
}
//桌面图标上传
function readURL(input) {
//判断文件类型,非严格
if( !input.value.match( /.png/i ) ){
alert('图片格式无效!');
return false;
}
var f=document.getElementById("doc");
var img=new Image();//动态创建img
img.src=f.value;
img.id="temp_img";
img.style.display="none";
document.body.appendChild(img);
if (input.files && input.files[0]) {
var reader = new FileReader();
reader.onload = function (e) {
$('#img_prev').attr('src', e.target.result);
$('#temp_img').attr('src',e.target.result);
};
reader.readAsDataURL(input.files[0]);
} else {
//IE下,使用滤镜
var docObj = document.getElementById('doc');
docObj.select();
//解决IE9下document.selection拒绝访问的错误
docObj.blur();
var imgSrc = document.selection.createRange().text;
var localImagId = document.getElementById("localImag");
$('#localImag').width(64).height(64); //必须设置初始大小
//图片异常的捕捉,防止用户修改后缀来伪造图片
try {
localImagId.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=scale)";
localImagId.filters.item("DXImageTransform.Microsoft.AlphaImageLoader").src = imgSrc;
} catch (e) {
alert("您上传的图片格式不正确,请重新选择!"); return false;
}
$('#img_prev').hide();
document.selection.empty();
}
var t = setInterval(
function() {
var temp = document.getElementById('temp_img');
//取图片大小和尺寸
if(temp.width>0){
var tWidth = temp.width;
var tHeight = temp.height;
if(temp.fileSize == undefined) {
var tSize=f.files[0].size;//火狐等标准取值办法
}else {
var tSize = temp.fileSize;
}
var imageInfo = {
'size':tSize,
'width': tWidth,
'height':tHeight
};
var imgMsg = '图片大小:' + imageInfo.size ;
imgMsg +="
图片宽度:" + imageInfo.width;
imgMsg +="
图片高度:" + imageInfo.height;
$('#imageMsg').html(imgMsg);
$(temp).remove();
clearInterval(t);
if(tWidth != 64 || tHeight !=64) alert('请上传64X64的图片');
}
},500
)
}
源文件:下载