天天看點

解決chrome和firefox中檔案上傳本地路徑隐藏的問題

  如果想上傳一張圖檔,在頁面中實作預覽,可以擷取檔案的上傳路徑,然後在一個<img/>裡面顯示,檔案的上傳路徑就是<input type="file"/>的value。在IE下是value是等于本地路徑的,然而,在chrome和firefox中,出于安全考慮,路徑卻是匿名,比如,上傳E盤中的readme.txt,得到的value卻是C:/fakepath/readme.txt。

  要在頁面顯示上傳的圖檔,可以先上傳到伺服器,然後再下載下傳下來回避這個問題,但這樣會有多餘的流量,不是好的做法。

  好在我找到了解決的辦法:

<code>&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;</code>

<code>&lt;</code><code>html</code> <code>xmlns</code><code>=</code><code>"http://www.w3.org/1999/xhtml"</code> <code>&gt;</code>

<code>&lt;</code><code>head</code><code>&gt;     </code>

<code>&lt;</code><code>meta</code> <code>http-equiv</code><code>=</code><code>"Content-Type"</code> <code>content</code><code>=</code><code>"text/html; charset=utf-8"</code> <code>/&gt;     </code>

<code>&lt;</code><code>title</code><code>&gt;本地圖檔預覽&lt;/</code><code>title</code><code>&gt;     </code>

<code>&lt;</code><code>style</code> <code>type</code><code>=</code><code>"text/css"</code><code>&gt;</code>

<code>#preview{width:100px;height:100px;border:1px solid #000;overflow:hidden;}</code>

<code>#imghead {filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=image);}</code>

<code>&lt;/</code><code>style</code><code>&gt;</code>

<code>&lt;</code><code>script</code> <code>type</code><code>=</code><code>"text/javascript"</code><code>&gt;</code>

<code>function previewImage(file)</code>

<code>{</code>

<code>  </code><code>var MAXWIDTH  = 100;</code>

<code>  </code><code>var MAXHEIGHT = 100;</code>

<code>  </code><code>var div = document.getElementById('preview');</code>

<code>  </code><code>if (file.files &amp;&amp; file.files[0])</code>

<code>  </code><code>{</code>

<code>      </code><code>div.innerHTML = '&lt;</code><code>img</code> <code>id</code><code>=</code><code>imghead</code><code>&gt;';</code>

<code>      </code><code>var img = document.getElementById('imghead');</code>

<code>      </code><code>img.onload = function(){</code>

<code>        </code><code>var rect = clacImgZoomParam(MAXWIDTH, MAXHEIGHT, img.offsetWidth, img.offsetHeight);</code>

<code>        </code><code>img.width = rect.width;</code>

<code>        </code><code>img.height = rect.height;</code>

<code>        </code><code>img.style.marginLeft = rect.left+'px';</code>

<code>        </code><code>img.style.marginTop = rect.top+'px';</code>

<code>      </code><code>}</code>

<code>      </code><code>var reader = new FileReader();</code>

<code>      </code><code>reader.onload = function(evt){img.src = evt.target.result;}</code>

<code>      </code><code>reader.readAsDataURL(file.files[0]);</code>

<code>  </code><code>}</code>

<code>  </code><code>else</code>

<code>    </code><code>var sFilter='filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=scale,src="';</code>

<code>    </code><code>file.select();</code>

<code>    </code><code>var src = document.selection.createRange().text;</code>

<code>    </code><code>div.innerHTML = '&lt;</code><code>img</code> <code>id</code><code>=</code><code>imghead</code><code>&gt;';</code>

<code>    </code><code>var img = document.getElementById('imghead');</code>

<code>    </code><code>img.filters.item('DXImageTransform.Microsoft.AlphaImageLoader').src = src;</code>

<code>    </code><code>var rect = clacImgZoomParam(MAXWIDTH, MAXHEIGHT, img.offsetWidth, img.offsetHeight);</code>

<code>    </code><code>status =('rect:'+rect.top+','+rect.left+','+rect.width+','+rect.height);</code>

<code>    </code><code>div.innerHTML = "&lt;</code><code>div</code> <code>id</code><code>=</code><code>divhead</code> <code>style</code><code>=</code><code>'width:"+rect.width+"px;height:"+rect.height+"px;margin-top:"+rect.top+"px;margin-left:"+rect.left+"px;"+sFilter+src+"\"'</code><code>&gt;&lt;/</code><code>div</code><code>&gt;";</code>

<code>}</code>

<code>function clacImgZoomParam( maxWidth, maxHeight, width, height ){</code>

<code>    </code><code>var param = {top:0, left:0, width:width, height:height};</code>

<code>    </code><code>if( width&gt;maxWidth || height&gt;maxHeight )</code>

<code>    </code><code>{</code>

<code>        </code><code>rateWidth = width / maxWidth;</code>

<code>        </code><code>rateHeight = height / maxHeight;</code>

<code>        </code> 

<code>        </code><code>if( rateWidth &gt; rateHeight )</code>

<code>        </code><code>{</code>

<code>            </code><code>param.width =  maxWidth;</code>

<code>            </code><code>param.height = Math.round(height / rateWidth);</code>

<code>        </code><code>}else</code>

<code>            </code><code>param.width = Math.round(width / rateHeight);</code>

<code>            </code><code>param.height = maxHeight;</code>

<code>        </code><code>}</code>

<code>    </code><code>}</code>

<code>    </code> 

<code>    </code><code>param.left = Math.round((maxWidth - param.width) / 2);</code>

<code>    </code><code>param.top = Math.round((maxHeight - param.height) / 2);</code>

<code>    </code><code>return param;</code>

<code>&lt;/</code><code>script</code><code>&gt;     </code>

<code>&lt;/</code><code>head</code><code>&gt;     </code>

<code>&lt;</code><code>body</code><code>&gt;</code>

<code>&lt;</code><code>div</code> <code>id</code><code>=</code><code>"preview"</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>img</code> <code>id</code><code>=</code><code>"imghead"</code> <code>width</code><code>=</code><code>100</code> <code>height</code><code>=</code><code>100</code> <code>border</code><code>=</code><code>0</code> <code>src</code><code>=</code><code>'../images/head01_big.jpg'</code><code>&gt;</code>

<code>&lt;/</code><code>div</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>br</code><code>/&gt;     </code>

<code>    </code><code>&lt;</code><code>input</code> <code>type</code><code>=</code><code>"file"</code> <code>onchange</code><code>=</code><code>"previewImage(this)"</code> <code>/&gt;     </code>

<code>&lt;/</code><code>body</code><code>&gt;     </code>

<code>&lt;/</code><code>html</code><code>&gt;</code>

  調用FileReader的readAsDataURL接口,将啟動異步加載檔案内容,通過給reader監聽一個onload事件,将資料加載完畢後,在onload事件進行中,通過reader的result屬性即可獲得檔案内容。

本文轉自 iampomelo 51CTO部落格,原文連結:http://blog.51cto.com/iampomelo/1652928,如需轉載請自行聯系原作者

繼續閱讀