【拾金者】用Sql Server儲存上載圖片字型

iDotNetSpace發表於2008-06-10

在學習Asp.net開發Web應用程式的時候,我遇上這樣一個問題.就是我們常見的在網站上傳圖片,檔案之類 

的,這在asp.net中似乎很簡單,不就一個HttpPostedFile就搞定了嗎?呵呵.的確,HttpPostedFile非常方便 

的給我們提供了從Local to Host的HttpPostedFile類.但是我在想,可否用資料庫來儲存這些圖片或檔案 

呢?答案是肯定的,計算機上的任何資料都是以二進位制儲存的.下面本著我這兩天的學習,來總結一下.... 

思路: 
任何計算機上的資料都以二進位制儲存.我們只需將資料以二進位制的形式儲存到資料庫即可. 
這裡我們使用Sql Server資料庫.用Image型別來儲存二進位制. 


步驟: 
1.當然是在Sql Server中建一個儲存上傳資料的表咯. 

id:上載資料內容的md5值確保資料庫中無重複資料,可用作檔名 
data:上載檔案資料 
type:副檔名 
length:資料長度 
time:上載時間 

CREATE TABLE [picture] ( 
 [id] [char] (32) COLLATE Chinese_PRC_CI_AS NOT NULL , 
 [data] [image] NULL , 
 [type] [char] (10) COLLATE Chinese_PRC_CI_AS NULL , 
 [length] [int] NULL , 
 [Time] [datetime] NULL , 
 CONSTRAINT [PK_picture] PRIMARY KEY  CLUSTERED  
 ( 
  [id] 
 )  ON [PRIMARY]  
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] 
GO 

2.建立一個HtmlInputFile控制元件物件myFile.上傳的資料就是通過這個物件myFile傳遞進來的.它有一個重 

要屬性PostedFile,它是一個HttpPostedFile物件 
PostedFile.ContentLength: 檔案長度  
PostedFile.ContentType:  檔案型別 
PostedFile.FileName  檔名 
PostedFile.InputStream  檔案流資料 
PostedFile.Save()  將檔案保入磁碟 


3.轉換上載的資料和處理要寫入資料庫中的資料 
客戶端上載的資料是以流的形式儲存在HttpPostedFile物件的InputStream中. 
接下來要做的就是處理資料流,將它轉換成二進位制資料 
//----------------轉換二進位制--------------------// 
InputStream.Seek(0,SeekOrigin.Begin); // 注意使用確保Position在開始 
byte[] bdata = new byte[Length];  
Data.Read(bdata,0,Length);  
  
//----------------以MD5儲存ID-------------------// 
InputStream.Seek(0,SeekOrigin.Begin); 
BinaryReader br = new BinaryReader(InputStream); 
char[] cd = new char[Length]; 
cd = br.ReadChars(Length); 
string id = new string(cd); 
id = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(id,"MD5"); 

//---------------其它儲存資料--------------------// 
string ExtName = PostedFile.FileName.Substring(PostedFile.FileName.LastIndexOf(".")+1) //取 

副檔名 
string Length = PostedFile.ContentLength //檔案大小 

4.ADO操作 
SqlConnection myConnection = new SqlConnection(ConString); 
SqlCommand UpLoadCommand = new SqlCommand("Insert into picture(id,data,type,length,time)  

values(@id,@data,@type,@length,getdate())",MyClass.Con); 
UpLoadCommand.Parameters.Add("@id",id); 
UpLoadCommand.Parameters.Add("@data",bdata); 
UpLoadCommand.Parameters.Add("@type",ExtName); 
UpLoadCommand.Parameters.Add("@length",Length); 

myConection.Open(); 
UpLoadCommand.ExecuteNonQuery(); 
myConnection.Close(); 

//---------------------------------------------------------------------------------------------------------------- 
讀取資料庫圖片就不用我說了吧..Response有一個為二進位制準備的BinaryWrite(byte[] buffer)方法.用它就可以把圖片輸出到IE上了 

下面是我的原始碼,把功能獨立到類中了.小弟沒學過C#,程式碼漏洞百出,呵呵.獻醜了. 

  

using System; 
using System.IO; 
using System.Web; 
using System.Data; 
using System.Data.SqlClient; 

namespace Pic 
...{ 
    /**////

 
    /// MyClass 的摘要說明。 
    ///
 
    public class MyClass 
    ...{ 
        public MyClass() 
        ...{ 
             
        } 
        public static string GetMD5String(string password) 
        ...{ 
            return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(password,"MD5"); 
        } 
        public static SqlConnection Con = new SqlConnection("server=.;uid=sa;pwd=network;initial catalog=MyHomePage;"); 
    } 
    public class MyUpLoad 
    ...{ 
        public MyUpLoad(HttpPostedFile UpLoadFile) 
        ...{ 
            Data = UpLoadFile.InputStream; 
            FileName = UpLoadFile.FileName.ToString(); 
            Length = UpLoadFile.ContentLength; 
            FileType =FileName.Substring(FileName.LastIndexOf(".")+1); 
        } 
        public byte[] GetByte() 
        ...{ 
            Data.Seek(0,SeekOrigin.Begin); 
            byte[] bdata = new byte[Length]; 
            Data.Read(bdata,0,Length); 

            return bdata; 
        } 
        public string GetID() 
        ...{ 
            Data.Seek(0,SeekOrigin.Begin); 
            BinaryReader br = new BinaryReader(Data); 
            char[] cd = new char[Length]; 
            cd = br.ReadChars(Length); 
            string id = new string(cd); 
            return MyClass.GetMD5String(id); 
        } 
        public bool UpLoadData() 
        ...{ 
            SqlCommand UpLoadCommand = new SqlCommand("Insert into picture(id,data,type,length,time) values(@id,@data,@type,@length,getdate())",MyClass.Con); 
            UpLoadCommand.Parameters.Add("@id",GetID()); 
            UpLoadCommand.Parameters.Add("@data",GetByte()); 
            UpLoadCommand.Parameters.Add("@type",FileType); 
            UpLoadCommand.Parameters.Add("@length",Length); 
             
            MyClass.Con.Open(); 
            try 
            ...{ 
                UpLoadCommand.ExecuteNonQuery(); 
                MyClass.Con.Close(); 
                return true; 
            } 
            catch 
            ...{ 
                MyClass.Con.Close(); 
                return false; 
            } 
             
        } 
        public int Length; 
        public string FileName; 
        public string FileType; 
        Stream Data; 
    } 

   MyUpLoad myLoad = new MyUpLoad(myFile.PostedFile); 
   Response.Write(myLoad.UpLoadData());

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-343198/,如需轉載,請註明出處,否則將追究法律責任。

相關文章