網站中的圖片可以保存到文件系統中
即專門的目錄用於圖片的存放
這樣的存儲配上數據庫中保存的圖片路徑信息
相信很多網站是這麼選擇的
這樣的搭配由於存儲和管理信息是分開的
其優點就是對數據庫的性能不會產生太大影響
但是也正是由於這種分開網站的目錄結構輕易是不可以變的
另外圖片數據的備份需要數據庫和文件目錄同步進行
另外一種存儲和管理圖片的方式是將圖片存到數據庫中
如果站點的圖片數量不是太多
圖片不是太大
這種方式是相當適合的
本文我們看一下如何使用ADO
NET Entity Framework構建數據訪問層
實現將圖片存到數據庫中以及從數據庫中獲取圖片
前期工作創建數據表+構建數據訪問層
第一步創建數據表
表中需要一個用於保存圖片的字段類型設置為image代碼如下
CREATE TABLE [dbo][images](
[id] [int] IDENTITY() NOT NULL
[imagefile] [image] NOT NULL)
第二步構建數據訪問層該類型的數據的插入與一般的基本SQL類型不同不過 平台上工作的程序員不需要考慮太多訪問數據庫的具體代碼我們可以選擇ADONET Entity Framework和Linq to SQL這裡我們以前者為例方法簡單介紹如下
項目中新建選擇ADONET Entity Data Model根據向導建立到數據庫的連接根據向導選擇數據庫中的剛才建立的表images向導結束之後項目中會添加一個edmx類型的文件默認的界面中會打開自動生成的實體類圖我們在向導中選擇的所有表格都會對應一個實體類默認的名稱是與數據表相同此處的images對應的實體類也是images但是這樣默認使用的話會造成歧義我們需要手動修改一下點擊images類在屬性對話框中將Name屬性改為imageEntity Set Name可以改為imageSet或者不改動保持images表示的是image集合之後實體類圖中對應的類名也變成image了這裡假設存放圖片的數據庫名為XXX那麼生成的管理類也就是我們後面使用最多的類名為XXXEntities
將圖片保存到SQL server數據庫中
首先聲明一個image類型的變量不妨稱之為img image img = new image();繼而創建一個XXXEntities對象 XXXEntities XXX = new XXXEntities();
(注意using命名空間和添加對SystemDataEntity的引用)
web頁面中添加FileUpload控件該控件提供一個屬性PostedFile能夠為服務器提供一個輸入輸出流剛好可以供我們將選擇的圖片讀到服務器的內存裡代碼如下
SystemIOStream stream = FileUploadPostedFileInputStream;
byte[] buffer = new byte[streamLength];
streamRead(buffer (int)streamLength);
streamClose();
imgimagefile = buffer;
接下來就是將代表圖片的字節數組存到數據庫中代碼如下
XXXAddToimageSet(t);
XXXSaveChanges();
這樣將圖片存入數據庫的操作就完成了
從數據庫中獲取圖片並顯示到頁面
頁面showImageaspx中放入一個Image控件命名為Image由於圖片是從數據庫取來的二進制文件因而不像使用文件系統時圖片都有自己的URL我們可以直接設置其URL為圖片在網站中的路徑
解決方法如下新建另外一個專門用於提供圖片的頁面getImageaspx其功能僅僅是從數據庫中讀取圖片
使用ResponseBinaryWrite()的方式將圖片數據流輸出接下來您可能已經想到了我們將image的URL設置為上述getImageaspx如果需要根據圖片的id之類的信息進行選擇我們為該頁面提供一個額外的id參數即可
讀取圖片依然使用上述的XXX實體管理類比如獲取id為的圖片代碼為
int id = intParse(RequestQueryString[id]);
image img = XXXimageSetWhere(i=> iID == id)First();
ResponseBinaryWrite(imgimageFile);
showImageaspx中為Image控件設置URL為getImageaspx?id=(可以在cs代碼中編程設置也可以在aspx中靜態設置)就可以正確顯示需要的圖片了
From:http://tw.wingwit.com/Article/program/net/201311/12098.html