向数据库存储读取图片方法总结



1.首先创建一个数据表SaveImageTest

ImageID:uniqueidentifier 主键

ImageType:varchar(32) 图片类型

ImageName:varchar(128) 图片名称

ImageContent:image 图片内容

ImageUrl:varchar(128) 图片存储路径

2.向数据库存储图片

2.1使用字节流的方式获取上传图片的内容

[csharp] view plain copy

<span style="font-size:12px;color:#000000;"> #region 获取图片内容方法一:通用方法,用用文件流的方式读取图
1.
片内容
2.
                //读取图片流
3.
                imgStream.Read(imageContent, 0, imageSize);
4.
                imgStream.Close();
5.
6.
                #endregion</span>
7.

2.2使用上传文件控件的GetByte属性获取图片内容

[csharp]

view plaincopy

<span style="font-size:12px;color:#000000;">#region 获取图片方法二:快捷方法 用上传控件的属性获取上传文件
1.
的字节数组
2.
                imageContent = fupLoadImage.FileBytes;
3.
4.
                #endregion</span>
5.

3.从数据库读取图片内容,显示在页面

3.1读取流,直接显示在当前页面

[csharp]

view plaincopy

<span style="font-size:12px;color:#000000;">/// <summary>
1.
    /// 读取图片方法1,触发后直接显示在本页面,但图片显示后其他控件不可见
2.
    /// </summary>
3.
    private void ReadImage()
4.
    {
5.
6.
        string sql = string.Format("SELECT  * FROM  SaveImageTest where ImageID='93B23E88-1F56-
7.
4C9E-BFAF-67126E1389B2' ");
8.
        SqlDataReader sqlRead = kpSql.ReadStu(sql, false);
9.
10.
        while (sqlRead.Read())
11.
        {
12.
            Response.ContentType = sqlRead["ImageType"].ToString();
p              yp     q     [    g  yp  ]         g();
13.
            Response.BinaryWrite((byte[])sqlRead["ImageContent"]);
14.
15.
        }
16.
        kpSql.CloseConn();
17.
18.
    }</span>
19.

3.2使用Image控件显示图片

为了灵活展示图片,满足实际需求,可添加一个新的页面,并用读取流的方法读取图片,将路径赋值给本页面的Image控件的ImageUrl即可

[csharp]

view plaincopy

<span style="font-size:12px;color:#000000;">  /// <summary>
1.
    /// 读取数据库图片方法二
2.
    /// 在本页面的适当位置添加image服务器控件,将需要的图片显示在另一个页面,给image控件的url赋值即可
3.
    /// </summary>
4.
    private void ReadImage2()
5.
    {
6.
        this.imgReadImage.ImageUrl = "OutPutImage.aspx";
7.
    }
8.
</span>
9.

4.利用路径实现图片的保存及读取

在实际的使用中,往往在服务器中占用一点硬盘控件直接利用图片的路径实现存储和读取,这样不仅能节省数据库空间,也方便频繁的读取

存储操作,同时更加安全。

4.1利用路径存储图片

[csharp]

view plaincopy

<span style="font-size:12px;color:#000000;">#region  方法三:将 图片保存至指定文件夹下
1.
2.
                //虚拟路径转化为物理路径用Server.MapPath()
3.
                //if (!Directory.Exists(Server.MapPath("E:\\资料\\ImageStorgeTest\\")))
4.
                if (!Directory.Exists("E:\\资料\\ImageStorgeTest\\"))
5.
                {
6.
                    //若不存在路径则创建该文件夹
7.
                    Directory.CreateDirectory("E:\\资料\\ImageStorgeTest\\");
8.
                    //已存在该图片则,生成新的文件名,不覆盖
9.
                    if (Directory.Exists("E:\\资料\\ImageStorgeTest\\" + imageName))
10.
                    {
11.
                       imageUrl=imageUrlBase+Path.GetFileNameWithoutExtension(fupLoadImage.Posted
12.
File.FileName)+"副本"+Path.GetExtension(fupLoadImage.PostedFile.FileName);
13.
                    }
14.
                }
15.
                fupLoadImage.PostedFile.SaveAs(imageUrl);
16.
                #endregion</span>
17.

4.2利用路径读取图片

前台控件定义:

[csharp]

view plaincopy

<span style="font-size:12px;color:#000000;"><td colspan="4">
1.
                方法四:
2.

原始页面布局(第 2 页)

                <img id="imgReadImageByUrl" runat="server" alt=""  width="100" height="150" />
3.
            </td>
4.
5.
</span>
6.

[csharp] view plain copy

<span style="font-size:12px;color:#000000;"> /// <summary>
1.
    /// 根据图片存储的路径,赋值给Img标签控件获取图纸
2.
    /// </summary>
3.
    private void ReadImage4()
4.
    {
5.
        string sql = string.Format("SELECT  * FROM  SaveImageTest where ImageID='724B53A8-C6E1-
6.
4FFC-BC68-D82B743A7846' ");
      DataTable dt=  kpSql.ExceTable(sql, "SaveImageTest");
7.
      if (dt.Rows.Count > 0)
8.
      {
9.
          this.imgReadImageByUrl.Src = @"E:\\资料\\ImageStorgeTest\\" + dt.Rows[0]
10.
["ImageName"].ToString();
      }
11.
    }
12.
13.
</span>
14.

附:全部代码如下

[csharp]

view plaincopy

#region 事件函数
1.
   /// <summary>
2.
   /// 点击确定存储图片到数据库中
3.
   /// </summary>
4.
   /// <param name="sender"></param>
5.
   /// <param name="e"></param>
6.
   protected void btnSelectImage_Click(object sender, EventArgs e)
7.
   {
8.
       //图片类型是否允许上传
9.
       bool flag = false;
10.
       if (fupLoadImage.HasFile)
11.
       {
12.
           //获取文件扩展名
13.
           string fileExtension = Path.GetExtension(fupLoadImage.FileName).ToUpper();
14.
           string[] allowExtension = { ".JPG", ".GIF", ".PNG" };
15.
           for (int i = 0; i < allowExtension.Length; i++)
16.
           {
17.
               if (allowExtension[i].Equals(fileExtension))
18.
               {
19.
                   flag = true;
20.
                   break;
21.
               }
22.
           }
23.
           //类型匹配,可以上传
24.
           if (flag)
25.
           {
26.
               string sqlStr = ConfigurationManager.AppSettings["ConnectionString"].ToString();
27.
               SqlConnection sqlConn = new SqlConnection(sqlStr);
28.
29.
               //上传文件的大小
30.
               int imageSize = fupLoadImage.PostedFile.ContentLength;
31.
               string imaType = fupLoadImage.PostedFile.ContentType;
32.
               Stream imgStream = fupLoadImage.PostedFile.InputStream;
33.
               //fupLoadImage.PostedFile.FileName包含完全路径的名字
34.
               string imageName = Path.GetFileName(fupLoadImage.PostedFile.FileName);
35.
               string imageUrlBase = "E:\\资料\\ImageStorgeTest\\";
36.
               string imageUrl = imageUrlBase + imageName;
37.
               byte[] imageContent = new byte[imageSize];
38.
39.
40.
               #region 获取图片内容方法一:通用方法,用用文件流的方式读取图片内容
41.
42.
               //读取图片流
43.
               imgStream.Read(imageContent, 0, imageSize);
44.
               imgStream.Close();
45.
46.
               #endregion
47.
48.
               #region 获取图片方法二:快捷方法 用上传控件的属性获取上传文件的字节数组
49.
50.
               imageContent = fupLoadImage.FileBytes;
51.
52.
               #endregion
53.
54.
               #region  方法三:将 图片保存至指定文件夹下
55.
56.
               //虚拟路径转化为物理路径用Server.MapPath()
57.
               //if (!Directory.Exists(Server.MapPath("E:\\资料\\ImageStorgeTest\\")))
58.
               if (!Directory.Exists("E:\\资料\\ImageStorgeTest\\"))
59.
               {
60.
                   //若不存在路径则创建该文件夹
61.
                   Directory.CreateDirectory("E:\\资料\\ImageStorgeTest\\");
62.
                   //已存在该图片则,生成新的文件名,不覆盖
63.
                   if (Directory.Exists("E:\\资料\\ImageStorgeTest\\" + imageName))
64.
                   {
65.
                       imageUrl = imageUrlBase + Path.GetFileNameWithoutExtension(fupLoadImage.Po
66.
stedFile.FileName) + "副本" + Path.GetExtension(fupLoadImage.PostedFile.FileName);
67.
                   }
68.
               }
69.
               fupLoadImage.PostedFile.SaveAs(imageUrl);
70.
               #endregion
71.
               string sql = @"INSERT INTO SaveImageTest(ImageID,ImageType,ImageName,ImageContent,
72.
ImageUrl)
                       VALUES(NEWID(),@imaType,@imageName,@imageContent,@imageUrl)";
73.
               SqlCommand comm = new SqlCommand(sql, sqlConn);
74.
75.
               SqlParameter paramImageType = new SqlParameter("@imaType", SqlDbType.VarChar, 50);
76.

               paramImageType.Value = imaType;
77.
               comm.Parameters.Add(paramImageType);
78.
79.
               SqlParameter paramImageName = new SqlParameter("@imageName", SqlDbType.VarChar, 64
80.
);
               paramImageName.Value = imageName;
81.
               comm.Parameters.Add(paramImageName);
82.
83.
               SqlParameter paramImageContent = new SqlParameter("@imageContent", SqlDbType.Image
84.
);
               paramImageContent.Value = imageContent;
85.
               comm.Parameters.Add(paramImageContent);
86.
87.
               SqlParameter paramImageUrl = new SqlParameter("@imageUrl", SqlDbType.VarChar, 128)
88.
;
               paramImageUrl.Value = imageUrl;
89.
               comm.Parameters.Add(paramImageUrl);
90.
91.
               sqlConn.Open();
92.
               int numRowsAffected = comm.ExecuteNonQuery();
93.
               sqlConn.Close();
94.
           }
95.
96.
       }
97.
   }
98.
99.
    #endregion
100.
101.
    #region 自定义功能函数
102.
103.
    /// <summary>
104.
    /// 读取图片方法1,触发后直接显示在本页面,但图片显示后其他控件不可见
105.
    /// </summary>
106.
    private void ReadImage()
107.
    {
108.
109.
        string sql = string.Format("SELECT  * FROM  SaveImageTest where ImageID='93B23E88-1F56-
110.
 4C9E-BFAF-67126E1389B2' ");
111.
        SqlDataReader sqlRead = kpSql.ReadStu(sql, false);
112.
113.
        while (sqlRead.Read())
114.
        {
115.
            Response.ContentType = sqlRead["ImageType"].ToString();
116.
           Response.BinaryWrite((byte[])sqlRead["ImageContent"]);
117.
118.
       }
119.
       kpSql.CloseConn();
120.
121.
   }
122.
123.
   /// <summary>
124.
   /// 读取数据库图片方法二
125.
   /// 在本页面的适当位置添加image服务器控件,将需要的图片显示在另一个页面,给image控件的url赋值即可
126.
   /// </summary>
127.
   private void ReadImage2()
128.
   {
129.
       this.imgReadImage.ImageUrl = "OutPutImage.aspx";
130.
   }
131.
132.
   private void ReadImage3()
133.
   {
134.
       string sql = string.Format("SELECT  * FROM  SaveImageTest where ImageID='724B53A8-C6E1-
135.
4FFC-BC68-D82B743A7846'");
       DataTable dt = kpSql.ExceTable(sql, "SaveImageTest");
136.
137.
       byte[] img = (byte[])dt.Rows[0]["ImageContent"];
138.
       kpSql.CloseConn();
139.
       MemoryStream ms = new MemoryStream(img, 0, img.Length);
140.
       PictureBox picture1 = new PictureBox();
141.
       picture1.Top = 160;
142.
       picture1.Left = 200;
143.
       picture1.Image = Image.FromStream(ms);
144.
145.
   }
146.
147.
   /// <summary>
148.
   /// 根据图片存储的路径,赋值给Img标签控件获取图纸
149.
   /// </summary>
150.
   private void ReadImage4()
151.
   {
152.
       string sql = string.Format("SELECT  * FROM  SaveImageTest where ImageID='724B53A8-C6E1-
153.
4FFC-BC68-D82B743A7846' ");
       DataTable dt = kpSql.ExceTable(sql, "SaveImageTest");
154.
       if (dt.Rows.Count > 0)
155.
       {
156.
           this.imgReadImageByUrl.Src = @"E:\\资料\\ImageStorgeTest\\" + dt.Rows[0]
157.
["ImageName"].ToString();
       }
158.
   }
159.
160.
161.
   #endregion
162.