這篇文章非常非常簡單,只是一個基本代碼的筆記而已。所以,已經知道方法的同學可以出去了。
地球人都知道我們為什麼要把檔案上傳到資料庫裡,所以原因我也懶得說。
預備工作:
在資料庫方面,我們需要有一個欄位,類型為Image,用來放圖片的內容。
第一步,上傳:
我還是按照我最常用的Info-Persister方式。Info類中這個欄位對應的屬性類型為byte[]。然後,在上傳組件的PostFile中,從它的InputStream讀出位元組數組,就OK了。
1 int len = this.File1.PostedFile.ContentLength;
2 byte[] buf = new byte[len];
3
4 Stream i = this.File1.PostedFile.InputStream;
5 i.Read(buf,0,buf.Length);
6 ti.content=buf; //賦給Info的一個屬性
7 i.Close();
得到了Info就可以按常規使用Persister的create來寫入資料庫了,也沒有什麼不一樣的。
因為我比較偷懶,用的是 object[] 作為預存程序的參數,而不是setParameter方法。
第二步,顯示:
圖片的顯示也很簡單,在Persister中注意一下:
1 SqlDataReader reader=SqlHelper.ExecuteReader(conStr,"p_hello_get",objs);
2
3 if( reader.Read() )
4 {
5 ti.name=reader.GetString(1);
6 ti.content=(byte[])reader[2]; //最簡單快速的方法就是這樣
7 }
8 reader.Close();
當然,如果你不喜歡強制轉型,還可以這樣:
1 ti.content=reader.GetSqlBinary(2).Value;
有了byte[]的內容,要顯示也比較簡單,在Page_Load()方法中加兩句話即可:
Response.ContentType="image/jpeg";
Response.BinaryWrite(ti.content);
這樣就可以輸出映像了,但是有一點要注意的是,如果想對映像做一點調整(比如旋轉,轉換格式之類的),或者想知道圖片的格式(是jpg 還是 gif),你也可以這樣:
1 //同樣,聲明輸出不是HTML而是image
2 Response.ContentType="image/jpeg";
3
4 //從byte[]得到一個image對象
5 System.Drawing.Image bmap = Bitmap.FromStream(new MemoryStream(ti.content));
6 //操作一下這個映像
7 bmap.RotateFlip(RotateFlipType.Rotate180FlipY);
8
9 //輸出到頁面上
10 bmap.Save(Response.OutputStream,System.Drawing.Imaging.ImageFormat.Jpeg);
11
12 //釋放image
13 bmap.Dispose();
14
當然,如何在asp中動態顯示映像,我就不多說了。無非就是讓<img src=指向一個aspx檔案,然後在這個aspx檔案中設定它的輸出不是HTML而是image即可。