1. 程式人生 > >C#+asp.net+sql資料庫完成圖片的儲存與讀取

C#+asp.net+sql資料庫完成圖片的儲存與讀取

我們在使用asp.net時經常會用到資料庫對圖片進行儲存和讀取,因此筆者對此進行了仔細研究,圖片的儲存和讀取有兩種方式:

一.以圖片的url地址的方式

在以圖片url地址的方式中,我們向資料庫中儲存的不是圖片本身,而是圖片的地址,讀取圖片的時候也是圖片的地址,根據儲存的地址定位到指定的圖片,首先筆者將講解圖片儲存到sql資料庫中的實現方法。

1.儲存圖片

1)在資料庫的表中定義一個用來儲存圖片路徑的欄位,型別為nchar(40),長度按自己要求設定;

2)我們通過網路將圖片上傳至伺服器,將圖片儲存到伺服器指定的路徑,因此我們需要建立一個資料夾“img'專門放置上傳的圖片,而我們資料庫中將要儲存的地址也是這個資料夾的地址;

3)在aspx檔案的Form 標記的 enctype 屬性應該設定成 enctype="multipart/form-data",網頁中放置一個web控制元件System.Web.UI.WebControls.FileUpload,這個控制元件是asp.net中專門用於上傳檔案的(html中是Input(file)),控制元件命名為‘inputfile’,另外新增一個按鈕button1,點選按鈕執行程式碼:

//設定儲存路徑

   string filepath = HttpContext.Current.Server.MapPath("~/img/");
           string filefullname = filepath + inputfile.FileName;
           inputfile.SaveAs(filefullname);
          string connstring = @"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Data.mdf;Integrated Security=True;User Instance=True";
          SqlConnection con = new SqlConnection(connstring);
          con.Open();
          string cmd = "insert into [user]([username],[password],[imgurl]) values(

'_username','_password','" + filefullname + "')";//儲存圖片
          SqlCommand dcmd = new SqlCommand(cmd, con); 
          dcmd.ExecuteNonQuery();

這樣我們就講上傳的圖片儲存到了img資料夾中,其url地址儲存到了資料庫中。

2.讀取圖片

下面是實現從資料庫中讀取圖片地址並在Image控制元件中顯示出來,我們只需進行一般的資料庫讀取得到imgurl欄位的值,然後將欄位值賦給Image控制元件的ImageUrl屬性,程式碼如下:

cmd="select [imgurl] from [user] where ([username]='

_username')";
        dcmd = new SqlCommand(cmd, con);
        SqlDataReader reader = dcmd.ExecuteReader();
        reader.Read();
        string path = reader[0].ToString();
        Image1.ImageUrl = path;
  

這樣我們就可以在Image控制元件中看到該圖片.

二.以二進位制圖片的方式

圖片在資料庫中另一種儲存方式就是將圖片變為二進位制方式存入,但是這種方式在讀取並在Image控制元件中顯示比較麻煩。下面我們來看實現方法:

1.儲存圖片

儲存圖片前,我們需要在資料庫的表中新增image型別的欄位,用於存放二進位制的圖片

public byte[] AddImg(System.Web.UI.WebControls.FileUpload inputimg, string ImageType, Int32 maxsize)

    {
        Int32 ImageSize;
        String strImageType;
        Stream ImageStream;
        strImageType = inputimg.PostedFile.ContentType;
        if (strImageType != ImageType)
        {
            Response.Write("<script>alert('圖片型別為'" + strImageType + ")</script>");
        }
        ImageSize = inputimg.PostedFile.ContentLength;
        if (ImageSize > maxsize)
        {
            Response.Write("<script>alert('圖片不得大於'" + maxsize + "k)</script>");
        }
        ImageStream = inputimg.PostedFile.InputStream;
        byte[] ImageContent = new byte[ImageSize];
        int imgstatus = ImageStream.Read(ImageContent, 0, ImageSize);
        return ImageContent;
    }

然後在button點選事件程式碼:

byte[] imageContent;
           imageContent = AddImg(inputfile, "image/pjpeg", 512000);
           string connstring = @"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Data.mdf;Integrated Security=True;User Instance=True";
           SqlConnection con = new SqlConnection(connstring);

           con.Open();
           string cmd = "insert into[user]([username],[password],[headimg]) values(‘_username','_password',@image)";

           SqlParameter prm = new SqlParameter("@image", SqlDbType.VarBinary, imageContent.Length, ParameterDirection.Input, false,
   0, 0, null, DataRowVersion.Current, imageContent);
           SqlCommand dcmd = new SqlCommand(cmd, con);
           dcmd.Parameters.Add(prm);
           dcmd.ExecuteNonQuery();

這樣我們就將圖片存入了資料庫

2.讀取圖片

但是這種方式在我們讀取顯示的方式有些不同,並不能直接根據url讓Image控制元件顯示

cmd = "select [headimg] from [user] where ([username]='_username')";
        dcmd = new SqlCommand(cmd, con);
        SqlDataReader reader = dcmd.ExecuteReader();
        reader.Read();
        byte[] img = (byte[])reader[0]; ;
        con.Close();
        Response.BinaryWrite(img);//這樣我們就將圖片寫入二進位制輸出流,在網頁中顯示

但如果我們像讓其顯示在Image控制元件,必須將圖片從資料庫中儲存到資料夾為圖片,將圖片url賦值給ImageUrl。