<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>4's symfony blog &#187; 预览</title>
	<atom:link href="http://www.foolbirds.com/t/%e9%a2%84%e8%a7%88/feed" rel="self" type="application/rss+xml" />
	<link>http://www.foolbirds.com</link>
	<description>all about symfony</description>
	<lastBuildDate>Fri, 14 Oct 2011 12:36:02 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>兼容IE6,IE7,IE8和Firefox的图片上传预览效果</title>
		<link>http://www.foolbirds.com/image-upload-preview.html</link>
		<comments>http://www.foolbirds.com/image-upload-preview.html#comments</comments>
		<pubDate>Thu, 06 Aug 2009 16:29:54 +0000</pubDate>
		<dc:creator>maker</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[上传]]></category>
		<category><![CDATA[图片]]></category>
		<category><![CDATA[预览]]></category>

		<guid isPermaLink="false">http://www.foolbirds.com/?p=967</guid>
		<description><![CDATA[所谓图片上传预览，就是在使用文件选择框选择了文件之后就可以在页面上看见图片的效果，关于这个效果我一直认为是无法做到的，没想到前不久被zhuozi搞定了。
网上流传的一些关于图片上传预览的代码都是差不多的，IE6下使用文件选择对象的value属性取出将要上传的本地文件路径，然后使用本地路径构造img标签，代码如下：
&#60;input type="file"
onchange="document.getElementById('view').innerHTML=' &#60;img src=\'' + this.value + '\'/&#62;';" /&#62;
&#60;div id="view"&#62; &#60;/div&#62;
网上有些人说上面的代码可以在IE7下生效，但实际测试是不行的，因为IE7的img标签不支持本地路径，所以需要使用div和css的filter来实现这个效果，代码如下：
&#60;input type="file" onchange=‘javascript:
document.getElementById("pic").filters.item("DXImageTransform.Microsoft.AlphaImageLoader").src
= this.value;’ /&#62;&#60;br /&#62;
&#60;div id="pic"
style="filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=scale);
width:400px;height:200px;"&#62;&#60;/div&#62;
而关于Firefox的图片上传预览效果，网上几乎找不到相关资料，比较容易想到的解决方案无非是自动将图片上传到服务器再显示出来诸如此类，但这里我们不对此类技术进行讨论，我们要做的是正宗的上传前本地预览。
以下是最后的研究结果，同时兼容IE6,IE7,IE8和Firefox。
&#60;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&#62;
&#60;html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"&#62;
&#60;head&#62;
&#60;meta http-equiv="Content-Type" content="text/html; charset=utf-8" /&#62;
&#60;script&#62;
var picPath;
var image;
// preview picture
function preview()
{
  document.getElementById('preview').style.display = 'none';
  // 下面代码用来获得图片尺寸，这样才能在IE下正常显示图片
  document.getElementById('box').innerHTML
    = "&#60;img width='"+image.width+"' height='"+image.height+"' id='aPic' src='"+picPath+"'&#62;";
}
// show [...]]]></description>
			<content:encoded><![CDATA[<p>所谓图片上传预览，就是在使用文件选择框选择了文件之后就可以在页面上看见图片的效果，关于这个效果我一直认为是无法做到的，没想到前不久被zhuozi搞定了。</p>
<p>网上流传的一些关于图片上传预览的代码都是差不多的，IE6下使用文件选择对象的value属性取出将要上传的本地文件路径，然后使用本地路径构造img标签，代码如下：</p>
<p><code>&lt;input type="file"<br />
onchange="document.getElementById('view').innerHTML=' &lt;img src=\'' + this.value + '\'/&gt;';" /&gt;<br />
&lt;div id="view"&gt; &lt;/div&gt;</code></p>
<p>网上有些人说上面的代码可以在IE7下生效，但实际测试是不行的，因为IE7的img标签不支持本地路径，所以需要使用div和css的filter来实现这个效果，代码如下：</p>
<p><code>&lt;input type="file" onchange=‘javascript:<br />
document.getElementById("pic").filters.item("DXImageTransform.Microsoft.AlphaImageLoader").src<br />
= this.value;’ /&gt;&lt;br /&gt;<br />
&lt;div id="pic"<br />
style="filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=scale);<br />
width:400px;height:200px;"&gt;&lt;/div&gt;</code></p>
<p>而关于Firefox的图片上传预览效果，网上几乎找不到相关资料，比较容易想到的解决方案无非是自动将图片上传到服务器再显示出来诸如此类，但这里我们不对此类技术进行讨论，我们要做的是正宗的上传前本地预览。</p>
<p>以下是最后的研究结果，<span style="color: #ff0000;">同时兼容IE6,IE7,IE8和Firefox</span>。</p>
<p><code>&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"<br />
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;<br />
&lt;html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"&gt;<br />
&lt;head&gt;<br />
&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8" /&gt;<br />
&lt;script&gt;<br />
var picPath;<br />
var image;<br />
// preview picture<br />
function preview()<br />
{<br />
  document.getElementById('preview').style.display = 'none';<br />
  // 下面代码用来获得图片尺寸，这样才能在IE下正常显示图片<br />
  document.getElementById('box').innerHTML<br />
    = "&lt;img width='"+image.width+"' height='"+image.height+"' id='aPic' src='"+picPath+"'&gt;";<br />
}<br />
// show view button<br />
function buttonShow()<br />
{<br />
/*<br />
这里用来解决图片加载延时造成的预览失败.<br />
简单说明一下，当image对象的src属性发生改变时JavaScript会重新给image装载图片内容，<br />
这通常是需要一些时间的，如果在加载完成之前想将图片显示出来就会造成错误，所以我们<br />
通过图片的宽度和高度来判断图片是否已经被成功加载，加载完毕才会显示预览按钮.<br />
这里我仍然有一个困惑，在IE7下预览效果偶尔会失效.<br />
*/<br />
  if ( image.width == 0 || image.height == 0 ) {<br />
    setTimeout(buttonShow, 1000);<br />
  } else {<br />
    document.getElementById('preview').style.display = 'block';<br />
  }<br />
}<br />
function loadImage(ele) {<br />
  picPath   = getPath(ele);<br />
  image     = new Image();<br />
  image.src = picPath;<br />
  setTimeout(buttonShow, 1000);<br />
}<br />
function getPath(obj)<br />
{<br />
  if(obj)<br />
  {<br />
    //ie<br />
    if (window.navigator.userAgent.indexOf("MSIE")&gt;=1)<br />
    {<br />
      obj.select();<br />
      // IE下取得图片的本地路径<br />
      return document.selection.createRange().text;<br />
    }<br />
    //firefox<br />
    else if(window.navigator.userAgent.indexOf("Firefox")&gt;=1)<br />
    {<br />
      if(obj.files)<br />
      {<br />
        // Firefox下取得的是图片的数据<br />
        return obj.files.item(0).getAsDataURL();<br />
      }<br />
      return obj.value;<br />
    }<br />
    return obj.value;<br />
  }<br />
}<br />
&lt;/script&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&lt;input type="file" name="pic" id="pic" onchange='loadImage(this)' /&gt;<br />
&lt;input id='preview' type='button' value='preview' style='display:none;' onclick='preview();'&gt;<br />
&lt;div id='box'&gt;&lt;/div&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;</code></p>
<p>补充：<br />
上面的代码经过测试貌似不是那么稳定，一些机器上的IE7会失效，我在6台电脑上测试，FF全通过，IE7下有一台没有通过，估计是和IE的设置有关， 而且即使可以正常使用也不是每次都可以成功显示出预览按钮，这个原因也没有找到，估计是图片加载失败什么的，所以例子里特殊处理的预览按钮的显示，即时预览功能失败也不影响其他功能。</p>
<p>下面是在我机器上IE7的测试图片：</p>
<p><a href="http://www.foolbirds.com/wp-content/uploads/2009/08/image-upload-preview-ie71.gif"><img src="http://www.foolbirds.com/wp-content/uploads/2009/08/image-upload-preview-ie71.gif" alt="image-upload-preview-ie7" title="image-upload-preview-ie7" width="400" height="434" class="aligncenter size-full wp-image-985" /></a></p>
<ul class="related_post"><li><a href="http://www.foolbirds.com/wideimage-in-symfony.html" title="在Symfony中使用第三方图片处理工具WideImage">在Symfony中使用第三方图片处理工具WideImage</a></li><li><a href="http://www.foolbirds.com/symfony-fckeditory-and-upload-image.html" title="在symfony中使用FCKeditor上传图片附件">在symfony中使用FCKeditor上传图片附件</a></li><li><a href="http://www.foolbirds.com/symfony12-upload-file-and-validate.html" title="symfony1.2中的文件上传和验证">symfony1.2中的文件上传和验证</a></li><li><a href="http://www.foolbirds.com/about-upload-images-path.html" title="关于上传图片后显示上传图片的路径问题">关于上传图片后显示上传图片的路径问题</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.foolbirds.com/image-upload-preview.html/feed</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
	</channel>
</rss>

