1. 程式人生 > >向資料庫儲存讀取圖片方法總結

向資料庫儲存讀取圖片方法總結

1.首先建立一個數據表SaveImageTest

ImageID:uniqueidentifier    主鍵

ImageType:varchar(32)    圖片型別

ImageName:varchar(128)   圖片名稱

ImageContent:image  圖片內容

ImageUrl:varchar(128) 圖片儲存路徑

2.向資料庫儲存圖片

2.1使用位元組流的方式獲取上傳圖片的內容

 #region 獲取圖片內容方法一:通用方法,用用檔案流的方式讀取圖片內容

                //讀取圖片流
                imgStream.Read(imageContent, 0, imageSize);
                imgStream.Close();

                #endregion


2.2使用上傳檔案控制元件的GetByte屬性獲取圖片內容

#region 獲取圖片方法二:快捷方法 用上傳控制元件的屬性獲取上傳檔案的位元組陣列
 
                imageContent = fupLoadImage.FileBytes;

                #endregion

3.從資料庫讀取圖片內容,顯示在頁面

3.1讀取流,直接顯示在當前頁面

/// <summary>
    /// 讀取圖片方法1,觸發後直接顯示在本頁面,但圖片顯示後其他控制元件不可見
    /// </summary>
    private void ReadImage()
    {

        string sql = string.Format("SELECT  * FROM  SaveImageTest where ImageID='93B23E88-1F56-4C9E-BFAF-67126E1389B2' ");

        SqlDataReader sqlRead = kpSql.ReadStu(sql, false);

        while (sqlRead.Read())
        {
            Response.ContentType = sqlRead["ImageType"].ToString();
            Response.BinaryWrite((byte[])sqlRead["ImageContent"]);

        }
        kpSql.CloseConn();

    }

3.2使用Image控制元件顯示圖片

為了靈活展示圖片,滿足實際需求,可新增一個新的頁面,並用讀取流的方法讀取圖片,將路徑賦值給本頁面的Image控制元件的ImageUrl即可

  /// <summary>
    /// 讀取資料庫圖片方法二
    /// 在本頁面的適當位置新增image伺服器控制元件,將需要的圖片顯示在另一個頁面,給image控制元件的url賦值即可
    /// </summary>
    private void ReadImage2()
    {
        this.imgReadImage.ImageUrl = "OutPutImage.aspx";
    }

4.利用路徑實現圖片的儲存及讀取

在實際的使用中,往往在伺服器中佔用一點硬碟控制元件直接利用圖片的路徑實現儲存和讀取,這樣不僅能節省資料庫空間,也方便頻繁的讀取儲存操作,同時更加安全。

4.1利用路徑儲存圖片

#region  方法三:將 圖片儲存至指定資料夾下

                //虛擬路徑轉化為物理路徑用Server.MapPath()
                //if (!Directory.Exists(Server.MapPath("E:\\資料\\ImageStorgeTest\\")))
                if (!Directory.Exists("E:\\資料\\ImageStorgeTest\\"))
                {
                    //若不存在路徑則建立該資料夾
                    Directory.CreateDirectory("E:\\資料\\ImageStorgeTest\\");
                    //已存在該圖片則,生成新的檔名,不覆蓋
                    if (Directory.Exists("E:\\資料\\ImageStorgeTest\\" + imageName))
                    {
                       imageUrl=imageUrlBase+Path.GetFileNameWithoutExtension(fupLoadImage.PostedFile.FileName)+"副本"+Path.GetExtension(fupLoadImage.PostedFile.FileName);
                       
                    }
                }
                fupLoadImage.PostedFile.SaveAs(imageUrl);
                #endregion


4.2利用路徑讀取圖片

前臺控制元件定義:

<td colspan="4">
                方法四:
                <img id="imgReadImageByUrl" runat="server" alt=""  width="100" height="150" />
            </td>

 /// <summary>
    /// 根據圖片儲存的路徑,賦值給Img標籤控制元件獲取圖紙
    /// </summary>
    private void ReadImage4()
    {
        string sql = string.Format("SELECT  * FROM  SaveImageTest where ImageID='724B53A8-C6E1-4FFC-BC68-D82B743A7846' ");
      DataTable dt=  kpSql.ExceTable(sql, "SaveImageTest");
      if (dt.Rows.Count > 0)
      {
          this.imgReadImageByUrl.Src = @"E:\\資料\\ImageStorgeTest\\" + dt.Rows[0]["ImageName"].ToString();
      }
    }

附:全部程式碼如下

 #region 事件函式
    /// <summary>
    /// 點選確定儲存圖片到資料庫中
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void btnSelectImage_Click(object sender, EventArgs e)
    {
        //圖片型別是否允許上傳
        bool flag = false;
        if (fupLoadImage.HasFile)
        {
            //獲取副檔名
            string fileExtension = Path.GetExtension(fupLoadImage.FileName).ToUpper();
            string[] allowExtension = { ".JPG", ".GIF", ".PNG" };
            for (int i = 0; i < allowExtension.Length; i++)
            {
                if (allowExtension[i].Equals(fileExtension))
                {
                    flag = true;
                    break;
                }
            }
            //型別匹配,可以上傳
            if (flag)
            {
                string sqlStr = ConfigurationManager.AppSettings["ConnectionString"].ToString();
                SqlConnection sqlConn = new SqlConnection(sqlStr);

                //上傳檔案的大小
                int imageSize = fupLoadImage.PostedFile.ContentLength;
                string imaType = fupLoadImage.PostedFile.ContentType;
                Stream imgStream = fupLoadImage.PostedFile.InputStream;
                //fupLoadImage.PostedFile.FileName包含完全路徑的名字
                string imageName = Path.GetFileName(fupLoadImage.PostedFile.FileName);
                string imageUrlBase = "E:\\資料\\ImageStorgeTest\\";
                string imageUrl = imageUrlBase + imageName;
                byte[] imageContent = new byte[imageSize];


                #region 獲取圖片內容方法一:通用方法,用用檔案流的方式讀取圖片內容

                //讀取圖片流
                imgStream.Read(imageContent, 0, imageSize);
                imgStream.Close();

                #endregion

                #region 獲取圖片方法二:快捷方法 用上傳控制元件的屬性獲取上傳檔案的位元組陣列

                imageContent = fupLoadImage.FileBytes;

                #endregion

                #region  方法三:將 圖片儲存至指定資料夾下

                //虛擬路徑轉化為物理路徑用Server.MapPath()
                //if (!Directory.Exists(Server.MapPath("E:\\資料\\ImageStorgeTest\\")))
                if (!Directory.Exists("E:\\資料\\ImageStorgeTest\\"))
                {
                    //若不存在路徑則建立該資料夾
                    Directory.CreateDirectory("E:\\資料\\ImageStorgeTest\\");
                    //已存在該圖片則,生成新的檔名,不覆蓋
                    if (Directory.Exists("E:\\資料\\ImageStorgeTest\\" + imageName))
                    {
                        imageUrl = imageUrlBase + Path.GetFileNameWithoutExtension(fupLoadImage.PostedFile.FileName) + "副本" + Path.GetExtension(fupLoadImage.PostedFile.FileName);

                    }
                }
                fupLoadImage.PostedFile.SaveAs(imageUrl);
                #endregion
                string sql = @"INSERT INTO SaveImageTest(ImageID,ImageType,ImageName,ImageContent,ImageUrl)
                        VALUES(NEWID(),@imaType,@imageName,@imageContent,@imageUrl)";
                SqlCommand comm = new SqlCommand(sql, sqlConn);

                SqlParameter paramImageType = new SqlParameter("@imaType", SqlDbType.VarChar, 50);
                paramImageType.Value = imaType;
                comm.Parameters.Add(paramImageType);

                SqlParameter paramImageName = new SqlParameter("@imageName", SqlDbType.VarChar, 64);
                paramImageName.Value = imageName;
                comm.Parameters.Add(paramImageName);

                SqlParameter paramImageContent = new SqlParameter("@imageContent", SqlDbType.Image);
                paramImageContent.Value = imageContent;
                comm.Parameters.Add(paramImageContent);

                SqlParameter paramImageUrl = new SqlParameter("@imageUrl", SqlDbType.VarChar, 128);
                paramImageUrl.Value = imageUrl;
                comm.Parameters.Add(paramImageUrl);

                sqlConn.Open();
                int numRowsAffected = comm.ExecuteNonQuery();
                sqlConn.Close();
            }

        }
    }

    #endregion

    #region 自定義功能函式

    /// <summary>
    /// 讀取圖片方法1,觸發後直接顯示在本頁面,但圖片顯示後其他控制元件不可見
    /// </summary>
    private void ReadImage()
    {

        string sql = string.Format("SELECT  * FROM  SaveImageTest where ImageID='93B23E88-1F56-4C9E-BFAF-67126E1389B2' ");

        SqlDataReader sqlRead = kpSql.ReadStu(sql, false);

        while (sqlRead.Read())
        {
            Response.ContentType = sqlRead["ImageType"].ToString();
            Response.BinaryWrite((byte[])sqlRead["ImageContent"]);

        }
        kpSql.CloseConn();

    }

    /// <summary>
    /// 讀取資料庫圖片方法二
    /// 在本頁面的適當位置新增image伺服器控制元件,將需要的圖片顯示在另一個頁面,給image控制元件的url賦值即可
    /// </summary>
    private void ReadImage2()
    {
        this.imgReadImage.ImageUrl = "OutPutImage.aspx";
    }

    private void ReadImage3()
    {
        string sql = string.Format("SELECT  * FROM  SaveImageTest where ImageID='724B53A8-C6E1-4FFC-BC68-D82B743A7846'");
        DataTable dt = kpSql.ExceTable(sql, "SaveImageTest");

        byte[] img = (byte[])dt.Rows[0]["ImageContent"];
        kpSql.CloseConn();
        MemoryStream ms = new MemoryStream(img, 0, img.Length);
        PictureBox picture1 = new PictureBox();
        picture1.Top = 160;
        picture1.Left = 200;
        picture1.Image = Image.FromStream(ms);

    }

    /// <summary>
    /// 根據圖片儲存的路徑,賦值給Img標籤控制元件獲取圖紙
    /// </summary>
    private void ReadImage4()
    {
        string sql = string.Format("SELECT  * FROM  SaveImageTest where ImageID='724B53A8-C6E1-4FFC-BC68-D82B743A7846' ");
        DataTable dt = kpSql.ExceTable(sql, "SaveImageTest");
        if (dt.Rows.Count > 0)
        {
            this.imgReadImageByUrl.Src = @"E:\\資料\\ImageStorgeTest\\" + dt.Rows[0]["ImageName"].ToString();
        }
    }


    #endregion