2011-12-16 40 views
6

我試圖顯示一個圖像從數據庫中作爲二進制流在Web窗體上獲取。你可以點亮這個!顯示從數據庫中提取的「圖像」在html內的二進制流作爲<img>標記

我正在開發一個項目,其中用戶有配置文件,並且每個用戶都有自己的個人資料圖片顯示在主頁上。這張照片來自數據庫。

這裏是我用來獲得流的代碼!

TestDBDataContext context1 = new TestDBDataContext(); 

      var r = (from a in context1.ImageTables where a.Id == 8 select a).First(); 

      MemoryStream stream = new MemoryStream(r.FileImage.ToArray()); 

感謝

回答

4

我在過去所做的那樣設置圖像的URL到一個aspx頁面,就像這樣:

<img src="getLogo.aspx" alt="Logo" /> 

然後,在代碼隱藏getLogo.aspx,我已經做了以下:

Response.BinaryWrite(imageData); 
Response.ContentType = "image/gif"; 

哪裏imageData是你的圖像作爲字節數組

3

我將圖像保存到使用廢話名(在網站內的目錄中,以外部呼叫者訪問(即圖像子目錄),如記錄在主鍵數據庫或GUID),然後在網頁中爲此文件添加一個href。

+0

謝謝,但如果我這樣做,爲什麼我把我保存在數據庫中呢?我知道這樣做的方法,但我正在尋找更好的東西,任何想法? – 2011-12-16 16:06:33

+1

@ShaneAdrianMuaz:我能想到的幾個理由:1)您最終可能擁有多個Web服務器,因此您不必在每個服務器上協調文件; 2)你可能會遷移到一個新的Web服務器或平臺,所以再也不必管理文件是值得的; 3)如果圖片代表與商業相關的內容,您可能需要/想要在不同的客戶端中展示它們,例如silverlight或平板電腦應用。 – 2011-12-16 16:10:34

+1

是的,但考慮到所有這些原因(他們已經選擇將其保存在數據庫中),爲什麼要將它作爲webroot中的文件?這有點奇怪。 – 2011-12-16 16:18:42

7

的Base64編碼的二進制文件,並在圖像標籤插入如下(修改以適應MIME類型):

<img src="data:image/gif;base64,BASE64 ENCODED BINARY HERE"> 

這是你會怎麼做,但我不會做,因爲有些瀏覽器無法處理它(IE6)。您最好先保存到文件中,然後按照常規方式進行操作。

1

保存內存流到文件使用:

MemoryStream memoryStream = new MemoryStream(); 
    using (FileStream fileStream = new FileStream(FilePath, FileMode.Open, FileAccess.Write)) 
    { 
     memoryStream.SaveTo(fileStream); 
    } 

然後把文件名在HTML中。

1

首先有一個單獨的.aspx文件的圖像(其實我贊成IHttpHandler的超載對於這一點,但原則是山姆e,讓我們一次只介紹一個新概念)。

.aspx文件只會從代碼隱藏繼承,並且沒有內容。所以它會有<%@ Page %>指令,沒有別的。

在代碼隱藏的頁面加載事件處理程序中,獲取圖像,並將響應的內容類型設置爲適當的值(或者,例如,如果所有圖像都是圖像/ png,則可以只是硬編碼)。然後將圖像寫入輸出。

TestDBDataContext context1 = new TestDBDataContext(); 
int id; 
if(int.TryParse(Request.QueryString["id"], out id)) 
{ 
    var r = (from a in context1.ImageTables where a.Id == 8 select a).FirstOrDefault(); 
    if(r != null) 
    { 
    Response.ContentType = r.ContentType; 
    Response.BinaryWrite(r.FileImage.ToArray()); 
    return; 
    } 
} 
//code to handle 404 not found for no such image here (send error message or Server.Transfer to error page, etc. 

然後你可以使用這個與<img src="profileImg.aspx?id=8" alt="" />

的性能改進是獲得字節的4K塊在從數據庫中的時間,並將其寫入到Response.OutputStream,在內存中,而不是一個巨大的陣列。對於小文件而言,差別並不重要,但對於非常大的文件而言,它可能相當可觀(例如「現在我的網絡服務器不再宕機!」相當可觀)。

相關問題