1.首先创建一个数据表SaveImageTest
ImageID:uniqueidentifier 主键
ImageType:varchar(32) 图片类型
ImageName:varchar(128) 图片名称
ImageContent:image 图片内容
ImageUrl:varchar(128) 图片存储路径
2.向数据库存储图片
2.1使用字节流的方式获取上传图片的内容
- <span style="font-size:12px;color:#000000;"> #region 获取图片内容方法一:通用方法,用用文件流的方式读取图片内容
- //读取图片流
- imgStream.Read(imageContent, 0, imageSize);
- imgStream.Close();
- #endregion</span>
2.2使用上传文件控件的GetByte属性获取图片内容
- <span style="font-size:12px;color:#000000;">#region 获取图片方法二:快捷方法 用上传控件的属性获取上传文件的字节数组
- imageContent = fupLoadImage.FileBytes;
- #endregion</span>
3.从数据库读取图片内容,显示在页面
3.1读取流,直接显示在当前页面
- <span style="font-size:12px;color:#000000;">/// <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();
- }</span>
3.2使用Image控件显示图片
为了灵活展示图片,满足实际需求,可添加一个新的页面,并用读取流的方法读取图片,将路径赋值给本页面的Image控件的ImageUrl即可
- <span style="font-size:12px;color:#000000;"> /// <summary>
- /// 读取数据库图片方法二
- /// 在本页面的适当位置添加image服务器控件,将需要的图片显示在另一个页面,给image控件的url赋值即可
- /// </summary>
- private void ReadImage2()
- {
- this.imgReadImage.ImageUrl = "OutPutImage.aspx";
- }
- </span>
4.利用路径实现图片的保存及读取
在实际的使用中,往往在服务器中占用一点硬盘控件直接利用图片的路径实现存储和读取,这样不仅能节省数据库空间,也方便频繁的读取存储操作,同时更加安全。
4.1利用路径存储图片
- <span style="font-size:12px;color:#000000;">#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</span>
4.2利用路径读取图片
前台控件定义:
- <span style="font-size:12px;color:#000000;"><td colspan="4">
- 方法四:
- <img id="imgReadImageByUrl" runat="server" alt="" width="100" height="150" />
- </td>
- </span>
- <span style="font-size:12px;color:#000000;"> /// <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();
- }
- }
- </span>
附:全部代码如下
- #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