本文提供一段JavaScript代码,实现在用户选择图片后、提交前于本地进行预览的功能。代码通过判断浏览器类型,分别采用File API的createObjectURL方法(适用于Firefox、Chrome、Safari)和IE特有的AlphaImageLoader滤镜,以解决不同浏览器对文件对象访问的差异,确保在大多数主流浏览器中均能正常显示预览图。
HTML结构与事件绑定
HTML结构代码如下:
<div id="localImag"><img id="preview" width="-1" height="-1" style="display:none" /></div>
<asp:FileUpload ID="file_head" runat="server" onchange="javascript:setImagePreview();" /> JavaScript预览逻辑实现
对应的JavaScript处理逻辑如下:
<script type="text/javascript">
function setImagePreview() {
var docObj = document.getElementById("ctl00_ContentMain_file_head");
var fileName = docObj.value;
if (!fileName.match(/.jpg|.gif|.png|.bmp/i)) {
alert('您上传的图片格式不正确,请重新选择!');
return false;
}
var imgObjPreview = document.getElementById("preview");
if (docObj.files && docObj.files[0]) {
//火狐下,直接设img属性
imgObjPreview.style.display = 'block';
imgObjPreview.style.width = '63px';
imgObjPreview.style.height = '63px';
//imgObjPreview.src = docObj.files[0].getAsDataURL();
if (window.navigator.userAgent.indexOf("Chrome") >= 1 || window.navigator.userAgent.indexOf("Safari") >= 1) {
imgObjPreview.src = window.webkitURL.createObjectURL(docObj.files[0]);
}
else {
imgObjPreview.src = window.URL.createObjectURL(docObj.files[0]);
}
} else {
//IE下,使用滤镜
docObj.select();
docObj.blur();
var imgSrc = document.selection.createRange().text;
var localImagId = document.getElementById("localImag");
//必须设置初始大小
localImagId.style.width = "63px";
localImagId.style.height = "63px";
//图片异常的捕捉,防止用户修改后缀来伪造图片
try {
localImagId.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=scale)";
localImagId.filters.item("DXImageTransform.Microsoft.AlphaImageLoader").src = imgSrc;
} catch (e) {
alert("您上传的图片格式不正确,请重新选择!");
return false;
}
imgObjPreview.style.display = 'none';
document.selection.empty();
}
return true;
}
</script> 多浏览器兼容性处理说明
此JS代码旨在解决360浏览器(其6.2版本基于Chrome内核)的显示问题。由于Chrome内核不识别window.URL.createObjectURL,因此代码中引入了对Safari内核特有的window.webkitURL.createObjectURL的支持,以兼容更多浏览器。
关键代码片段如下:
window.URL.createObjectURL(docObj.files[0]); 上述代码仅在Firefox环境下原生支持,而在Chrome浏览器中无法直接识别window.URL.createObjectURL,因此需要借助Safari内核的window.webkitURL.createObjectURL来实现兼容。