1. 程式人生 > >base64編碼的圖片在HTML的img控制元件中顯示

base64編碼的圖片在HTML的img控制元件中顯示

最近在做一個移動web app專案的開發,將客戶經理與客戶的聊天功能搬到手機中(類似微信聊天),其中客戶經理的頭像由原電腦端的聊天專案組同事提供。他們儲存在資料庫中的圖片資訊為varbinary型別的數值,也就是以二進位制資料儲存。自己寫了個根據客戶經理的ID查詢其頭像資訊的介面(即中臺wcf服務),將這個varbinary值讀取出來,通過日誌中記錄的這些值的形式,發現是base64編碼的方式。於是就有了之後的研究,就是將base64編碼的圖片顯示的問題:

方法①:<img>控制元件

<img alt="頭像" src="../Handler/GetPhoto.ashx?AgentID=×××"
>
後臺程式碼GetPhoto.ashx中,將獲取到的base64編碼的值做如下轉換: byte[] image = Convert.FromBase64String(result); //context.Response.ContentType = "image/png" 看網上別人部落格寫的一般都會加上這句話,沒有加也能顯示,具體的原理就不清楚了。context.Response.BinaryWrite(image); 其中result即為從資料庫中獲取到的varbinary型別的資料值儲存為byte[]型別返回的結果。至此,前端介面的<img>控制元件呼叫該後臺程式碼即可顯示相應的圖片。
(此段可以不看!該專案wcf服務中,介面加上了WebGet方式,就是為了實現通過http方式訪問來呼叫介面,使用restful風格來訪問介面。後來專案實際投產過程中,發現js中通過http方式呼叫介面行不通, 因為外部網路無法直接訪問內部的中臺wcf服務所在的伺服器,這個之前真是沒想到啊!!實際就是因為js檔案相當於直接下載到本地來執行的,內部的中臺伺服器不允許開通外網訪問的許可權(網路限制比較嚴格), 所以不能直接訪問的,故為了不讓之前寫的所有介面浪費掉,又在中間包裝了一層handler(.ashx),寫下這段也主要是為了引以為戒,做好設計工作很重要,另外估計也會有人疑惑為什麼中臺又是handler ,又是wcf的。)
方法②:<img>控制元件

<img src="data:image/png;base64,具體的編碼值(即①中的result)">同樣可以展示

該方法得益於他人的一篇文章,原文地址:玩轉圖片base64編碼

附:wcf服務的相關筆記

wcf服務中加上webget,就可以用http的方式訪問該服務,也是本專案wcf服務採用的做法。 例如:        [OperationContract]        [WebGet(UriTemplate="/QryData/{id}")]        Stream QryData(string ID); 即可通過
http://localhost:×××/Services/×××.svc/QryData/a 來獲取a的相關內容。

本人才疏學淺,如有不正確的地方,希望各位大大們批評指正,謝謝!成長的路上,有你們的指點,才會更好。微笑