在项目中,有上传本地图片先预览的功能。原先在本机IE6,IE7浏览器中可正常预览的功能,但在将项目布暑到远程服务器的时候,在IE7中不能预览了。此问题,在之前同事的IE7访问我机子预览时也出现过,当时没在意,认为系统不会有问题。
今天,上网找了许久,终于知道了,这原来是IE7中加强了安全限制。通过http访问的页面默认是没有访问用户本机图片文件的权限的,所以通过 javascript获取不了本机的图片路径等相关信息。网上也有几种解决方案,一种是通过利用style 的"DXImageTransform.Microsoft.AlphaImageLoader" 滤镜来实现,而另一种,则是设置当前站点为安全站点即可。
由于,预览还涉及到图片旋转等,利用"DXImageTransform.Microsoft.AlphaImageLoader"方式,确不知道该如何旋转此滤镜中的图片,故暂时决定采用设置安全性方式,有劳用户了。
一些莫名其妙的错误都是有源头的。
收集的资料贴出来:
在IE6.0中,用户可以在javascript中或许最终用户本地图片的长宽:
- <Script language=Javascript>
- function getLocalImageInfo( imgUrl )
- {
- var objImg = new Image();
- objImg.src = imgUrl;
- alert( objImg.width )
- alert( objImg.height )
- }
- getLocalImageInfo("file://c:\1.jpg");
- </Script>
并且,在IE6.0中,在客户端本地上传图片前可以通过Javascript/html预览要上传的图片,并获取图片的文件大小:
- <html>
- <head>
- <title>Upload file</title>
- </head>
- <body>
- <input type="file" onchange="javascript:previewImage(this.value)" >
- <img id="img" />
- <script language="javascrtip">
- function previewImage( imgUrl )
- {
- var objImg = document.getElementById("img");
- objImg.src = imgUrl;
- alert( "the size of the image file:" + objImg.fileSize )
- }
- </script>
- </body>
- </html>
Note: 上面的代码最好在img图片加载完毕后再取图片的大小,例如:objImg.onreadystatechange()=function{ if(objImg.readystate=="complete")............}
当在IE7中,如果上述代码放在客户机本机(以html的形式放在客户机器上,而不是放在IIS中通过http访问)以文件方式打开时仍然能实现IE6中的功能,但如果上述代码放在IIS中,用IE7 通过HTTP协议访问则不能正常工作。
经过查找资料才发现IE7在安全性方面做了提升,通过http访问的页面默认是没有访问用户本机图片文件的权 限的,所以通过javascript获取不了本机的图片长宽,也不能将本机图片地址赋值给<img>对象。如果将所访问的站点放入"可信站 点"列表中(IE7->工具->Internet选项->安全->可信站点),则可以如IE6一样正常工作。
如果不想通过客户将本站点设置为"可信"站点的方式来实现上传图片的预览及获取图片长宽信息,则可以利用style的"DXImageTransform.Microsoft.AlphaImageLoader" 滤镜来实现:
- <html >
- <head id="Head1" runat="server">
- <title>Untitled Page</title>
- <script language=javascript>
- function setImagePreview( fileUrl )
- {
- var objDivFilter = document.getElementById("divFilter")
- if( fileUrl )
- {
- objDivFilter.style.width = "400px";
- objDivFilter.style.height = "400px"; //这个设置初始大小是必须的
- objDivFilter.style.filter="progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod = image)";
- objDivFilter.filters.item("DXImageTransform.Microsoft.AlphaImageLoader").src = fileUrl;
- // get width and height
- alert( objDivFilter.offsetWidth)
- alert( objDivFilter.offsetHeight)
- }
- }
- </script>
- </head>
- <body>
- <form id="form1" runat="server">
- <div>
- <asp:FileUpload ID="txtFile" runat="server" Width="508px" onchange="javascript:setImagePreview( this.value );" />
- <br />
- <div id="divFilter" />
- </div>
- </form>
- </body>
但上述办法还不能在客户端获取图片文件的大小,我也没有找到很好的解决方案。
另外:在.net中,可以在C#后台代码中获取图片的相应信息,只不过这种方式增加了一些不必要的网络传输过程,有一定的性能代价。
-
资料二:
-
本地图片预览代码(支持 IE6、IE7)
在 IE6 中,可以很方便地利用 img 的 src 属性,实现本地图片预览,然而在 IE7 中,这种办法却行不通。需要用 AlphaImageLoader。
AlphaImageLoader
说明:
在对象容器边界内,在对象的背景和内容之间显示一张图片。并提供对此图片的剪切和改变尺寸的操作。如果载入的是PNG(Portable Network Graphics)格式,则0%-100%的透明度也被提供。
语法:
filter : progid:DXImageTransform.Microsoft.AlphaImageLoader ( enabled=bEnabled , sizingMethod=sSize , src=sURL )
enabled:可选项。布尔值(Boolean)。设置或检索滤镜是否激活。
true:默认值。滤镜激活。
false:滤镜被禁止。
sizingMethod:可选项。字符串(String)。设置或检索滤镜作用的对象的图片在对象容器边界内的显示方式。
crop:剪切图片以适应对象尺寸。
image:默认值。增大或减小对象的尺寸边界以适应图片的尺寸。
scale:缩放图片以适应对象的尺寸边界。
src:必选项。字符串(String)。使用绝对或相对 url 地址指定背景图像。假如忽略此参数,滤镜将不会作用。
具体操作:
- 为预览区域(比如要在某个 div 中预览)添加样式:filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=scale);。
- 为 AlphaImageLoader 设置 src 属性。
示例代码:
[Ctrl+A 全部选择 提示:您可先修改部分代码,再按运行]
相关阅读:http://www.cftea.com/products/ 很好的学习地方