首先有一個單獨的.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
,在內存中,而不是一個巨大的陣列。對於小文件而言,差別並不重要,但對於非常大的文件而言,它可能相當可觀(例如「現在我的網絡服務器不再宕機!」相當可觀)。
謝謝,但如果我這樣做,爲什麼我把我保存在數據庫中呢?我知道這樣做的方法,但我正在尋找更好的東西,任何想法? – 2011-12-16 16:06:33
@ShaneAdrianMuaz:我能想到的幾個理由:1)您最終可能擁有多個Web服務器,因此您不必在每個服務器上協調文件; 2)你可能會遷移到一個新的Web服務器或平臺,所以再也不必管理文件是值得的; 3)如果圖片代表與商業相關的內容,您可能需要/想要在不同的客戶端中展示它們,例如silverlight或平板電腦應用。 – 2011-12-16 16:10:34
是的,但考慮到所有這些原因(他們已經選擇將其保存在數據庫中),爲什麼要將它作爲webroot中的文件?這有點奇怪。 – 2011-12-16 16:18:42