今天在做集團網站的部落格子系統的時候遇到了一個問題,圖片路徑問題。系統使用資料庫儲存圖片路徑,然後系統中的各個頁面從資料庫中擷取路徑顯示圖片。路徑用如下方式儲存(~/admin/blog/potho/1235.jpg)。因為需要顯示圖片的頁面在網站的不同目錄下。所以開始考慮使用如上方式儲存。使用.net的asp:Image控制項能夠正常顯示圖片。但是如果要將圖片路徑放在<a>標記的href屬性中,就會出現如下形式的路徑(http://localhost/web/admin/blog/~/admin/blog/potho/1235.jpg),導致路徑出現錯誤。原因可能是a標記不會解析波浪線。
因此考慮在資料庫中儲存相對路徑,格式如下:admin/blog/potho/1235.jpg。這樣在使用圖片路徑的時候就需要對路徑進行拼接。擷取網站的根路徑加片的路徑得到完整路徑。例如:根路徑(http://localhost/)+ 圖片路徑(admin/blog/potho/1235.jpg)。這樣在a標記中就不會再出現問題。但是如果將網站配置成為虛擬目錄的話,問題又出現了,因為根路徑變為了(http://localhost/web/)這種形式,在以後客戶部署時可能還會變。所以要將這個可變的因素拿出來,變為可動態配置。可以考慮放入web.config檔案中,因為此檔案中的內容不需要編譯。這樣在我們部署網站時就可以靈活的修改路徑了。
接下來測試asp:Image控制項,對控制項的ImgeUrl使用如下方式邦定了資料:ImageUrl='<%#Common.GetRootPath() %><%# Eval("smallpthotaddress") %>',運行時出現了錯誤。錯誤資訊是:CS1040: 前置處理器指令必須作為一行的第一個非空白字元出。查看錯誤源可以看到:dataBindingExpressionBuilderTarget.ImageUrl = System.Convert.ToString(Common.GetRootPath() %><%# Eval("smallpthotaddress") , System.Globalization.CultureInfo.CurrentCulture);注意看標黃的部分,顯然兩個運算式被傳入Convert.ToString方法轉換為字串,但我們的運算式卻沒有被正常解析。原因是什麼呢,一個邦定運算式的時候並不會出現問題。難道不能放兩個標達式。但在a標記中是同樣的寫法怎麼就沒問題呢,a標記的綁定原來被解釋成如下格式:target.SetDataBoundString(0, System.Convert.ToString(Common.GetRootPath(), System.Globalization.CultureInfo.CurrentCulture));target.SetDataBoundString(1, System.Convert.ToString(Eval("photoPath"), System.Globalization.CultureInfo.CurrentCulture));看來.net環境對伺服器端控制項和用戶端控制項的解析方式不同,所以在對asp:Image控制項綁定時才會出現問題。好,問題的根源找到了,那就想個辦法解決,.net環境的解析方式我們左右不了,那就給asp:Image控制項綁定一個運算式,改為如下綁定方式:'<%#Common.GetAbsolutePath( Eval("smallpthotaddress").ToString()) %>'。問題解決。
總結:在做網站的時候將上傳得檔案和圖片盡量放在一個檔案目錄。方便管理,因為可能很多人都會用到。擷取路徑的方法寫成公用方法,所有人都使用此方法擷取路徑。路徑需要改動的最好把改動的部分變為可配置的。儲存路徑時將路徑儲存為相對路徑。