C# 图片数据库存储、读取页面展示

    一个网站,图片数据是一定存在的;图片存储如何处理,有很多方式。

    自己总结两种:1、将图片保存为静态文件形式;(优点:文件容易转移、备份;缺点:文件丢失不易恢复)2、将图片转换为字节流获其他方式获取图片完整数据进行存储(优点:数据库保存,不易丢失;缺点:数据库空间增长较快)    

    之前图片保存是通过保存文件名称等基本信息,未对图片的原始内容进行处理;最近 想换种方式进行图片数据保存;特记录。

    保存文件完整信息,常用的方式是将文件转换为二进制流,保存进数据库,当然也可以保存图片为base64 数据流。

    1、工具: 数据库SQLServer 2012 R2;开发语言:C# ;展示形式:通过MVC 进行web 处理展示。

    2、数据库图片信息表 核心字段介绍:FileContent varbinary(max) NULL,   ----图片内容保存字段,字段类型 varbinary(max)  -->对应C# 中字段类型  byte[]

    3、获取图片文件字节流(用于数据库存储)    

        /// <summary>
        /// 根据图片路径返回图片的字节流byte[]
        /// </summary>
        /// <param name="imagePath">图片路径</param>
        /// <returns>返回的字节流</returns>
        public static byte[] getImageByte(string imagePath)
        {
            FileStream files = new FileStream(imagePath, FileMode.Open);
            byte[] imgByte = new byte[files.Length];
            files.Read(imgByte, 0, imgByte.Length);
            files.Close();
            return imgByte;
        }

    4、将获取到的图片字节流存入数据库    

            /// <summary>
            /// 添加图片内容信息到数据库
            /// </summary>
            /// <param name="path"></param>
            /// <returns></returns>
            public static int InsertImg(string path)
            {
                //----------以文件的方式读取图片并转化成字节流
                FileStream fs = new FileStream(path, FileMode.Open);
                byte[] imgSourse = new byte[fs.Length];
                fs.Read(imgSourse, 0, imgSourse.Length);
                fs.Close();
                //--------------读取图片并转化成字节流结束----------------

                using (SqlConnection conn = new SqlConnection(SqlHelper.connStr))
                {
                    conn.Open();
                    using (SqlCommand cmd = conn.CreateCommand())
                    {
                        //cmd.CommandText = "update PictureInfo set [email protected] ";
                        cmd.CommandText = "insert into PictureInfo (FileContent) VALUES [email protected]";
                        //cmd.Parameters.Add("@fileContent", System.Data.SqlDbType.Image);
                        cmd.Parameters.Add(new SqlParameter("@fileContent", imgSourse));
                        return cmd.ExecuteNonQuery();
                    }
                }
            }        

     5、读取数据库中图片信息展示到页面(Winform 中有Picture 控件,可以直接使用Image 展示;MVC 中需要做一些处理。)

      (1)、Winform 中展示        

        /// <summary>
        /// 展示单张图片到页面
        /// </summary>
        public void ReturnImageShow()
        {
            //.....省略数据获取过程
            //获取存储的某图片字节流
            byte[] ImageLogoArray = row["FileContent"] is DBNull ? null : (byte[])(row["FileContent"]);
            MemoryStream ms = null;
            if (ImageLogoArray != null)
            {
                ms = new MemoryStream(ImageLogoArray);
                this.picBox.Image = new Bitmap(ms);
            }
        }

       (2)、MVC 中展示(后台)      

         // GET: Pictures/Index
        /// <summary>
        /// 数据展示方法(使用前台js 处理、调用渲染img 的src )
        /// </summary>
        /// <returns></returns>
        public ActionResult Index()
        {
            using (DataContext dbContext = new DataContext())
            {
                //获取待展示列表数据
                PictureInfoService infoService = new PictureInfoService(dbContext);
                var userList = dbContext.Set<PictureInfo>();
                //传值list<T> 数据
                ViewData["PicInfo"] = userList.ToList();
            }

            return View();
        }      

        // GET: Pictures/IndexAdv
        /// <summary>
        /// 展示数据(后台直接拼接图片标签内容,使用页面传值方法直接在页面渲染)
        /// </summary>
        /// <returns></returns>
        public ActionResult IndexAdv()
        {
            using (DataContext dbContext = new DataContext())
            {
                //获取所需数据
                PictureInfoService infoService = new PictureInfoService(dbContext);
                var userList = dbContext.Set<PictureInfo>();
                //后台格式化文本直接读取
                StringBuilder builder = new StringBuilder();
                foreach (var data in userList)
                {
                    //此处 src 属性赋值 需要指向后台字节流转换方法
                    builder.AppendFormat(" <div class=\"item\"><img id=\"image{0}\" src=\"../Pictures/ReturnPic?id={1}&random=Math.random()\" title=\"{2}\" /></div>", data.Id, data.Id, data.FileName);
                }
                //后台拼接的页面标签
                //MVC (非Core )前台识别HTML 使用  @Html.Raw(ViewBag.DataBuilder)
                ViewBag.DataBuilder = builder.ToString();
            }
            return View();
        }

        /// <summary>
        /// 返回图片(后台添加图片字节流处理方法)
        /// </summary>
        /// <param name="id">查询条件(id索引)</param>
        /// <returns></returns>
        public FileStreamResult ReturnPic(int id)
        {
            using (DataContext dbContext = new DataContext())
            {
                //本处使用的EF ,只做示例;主要获取对应的图片内容信息byte[]
                PictureInfoService infoService = new PictureInfoService(dbContext);
                var data = infoService.Find<PictureInfo>(id);
                //将获取到的字节流放入MemoryStream ,用于返回
                //MVC 中前台展示字节流的图片,需要特殊处理,
                //返回类型为 FileStreamResult
                MemoryStream ms = new MemoryStream(data.FileContent);
                return new FileStreamResult(ms, "image/jpeg");
            }
        }             

       (3)、MVC 展示前台部分

          IndexAdv.cshtml

          

          Index.cshtml

            

        6、图片字节流一般转换封装

    using System.Drawing;
    using System.IO;
    public class ImgTransHelper
    {
        /// <summary>
        /// 图片转换成字节流
        /// </summary>
        /// <param name="img">要转换的Image对象</param>
        /// <returns>转换后返回的字节流</returns>
        public static byte[] ImgToByt(Image img)
        {
            MemoryStream ms = new MemoryStream();
            byte[] imagedata = null;
            img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
            imagedata = ms.GetBuffer();
            return imagedata;
        }

        /// <summary>
        /// 字节流转换成图片
        /// </summary>
        /// <param name="byt">要转换的字节流</param>
        /// <returns>转换得到的Image对象</returns>
        public static Image BytToImg(byte[] byt)
        {
            MemoryStream ms = new MemoryStream(byt);
            Image img = Image.FromStream(ms);
            return img;
        }

        /// <summary>
        /// 根据图片路径返回图片的字节流byte[]
        /// </summary>
        /// <param name="imagePath">图片路径</param>
        /// <returns>返回的字节流</returns>
        private static byte[] getImageByte(string imagePath)
        {
            FileStream files = new FileStream(imagePath, FileMode.Open);
            byte[] imgByte = new byte[files.Length];
            files.Read(imgByte, 0, imgByte.Length);
            files.Close();
            return imgByte;
        }
    }

        以上为记录内容,如有不足之处,欢迎指正!

原文地址:https://www.cnblogs.com/skyheaving/p/12387594.html

时间: 2024-10-09 02:30:59

C# 图片数据库存储、读取页面展示的相关文章

Hibernate图片数据库存储

1. 数据库设计 类型:mediumblob 2. 实体类设计 java.sql.Blob对象:image 3. hibernate映射 <property name="image" type="blob"> <column name="IMAGE" sql-type="mediumblob"></column> </property> 4. 逻辑实现 1). 存储 News n

从数据库读取图片路径后在页面上显示出来

从数据库读取图片路径后在页面上显示出来 代码: 1 //直接将代码放到php文件里 2 $con = mysqli_connect("localhost", "123", "123", "123");//连接数据库 3 $sql = "SELECT * FROM table";//读取表 4 $result = $con->query($sql); 5 while ($row = $result-&g

C#从SQL server数据库中读取l图片和存入图片

原文:C#从SQL server数据库中读取l图片和存入图片 本实例主要介绍如何将图片存入数据库.将图片存入数据库,首先要在数据库中建立一张表,将存储图片的字段类型设为Image类型,用FileStream类.BinaryReader把图片读成字节的形式,赋给一个字节数组,然后用ADO.SqlCommand对象的ExecuteNonQuery()方法来把数据保存到数据库中.主要代码如下: private void button1_Click(object sender, EventArgs e)

php将图片保存到mysql数据库及从数据库中读取图片的方法源码 转

php将图片保存到mysql数据库及从数据库中读取图片的方法源码 分类: 网站 2012-03-11 15:25 5059人阅读 评论(0) 收藏 举报 数据库mysqlphpsql serverquerydatabase 一般来讲都是把图片保存到服务器下,然后根据路径读出的,但是有时候出于安全及版权什么的考虑,会把图片保存到mysql的数据库中,然后再读出来,这样的图片点击右键属性,是看不到图片地址的.下面逍遥一生就介绍下如何用php把图片存储到mysql中及如何读出.     MySQL数据

SSM框架整合(实现从数据库到页面展示)

SSM框架整合(实现从数据库到页面展示) 首先创建一个spring-web项目,然后需要配置环境dtd文件的引入,环境配置,jar包引入. 首先让我来看一下ssm的基本项目配件.(代码实现) 1.首先编写web.xml文件. <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" x

读取本地图片写到jsp页面

//读取本地图片写到jsp页面 File file = new File("D:/parking/A区12号.jpg"); ServletOutputStream out = null; InputStream in = null; try { in = new FileInputStream(file); response().setContentType("multipart/form-data"); int tempbyte; out = response()

[转]asp.net mvc 从数据库中读取图片

本文转自:http://www.cnblogs.com/mayt/archive/2010/05/20/1740358.html 首先是创建一个类,继承于ActionResult,记住要引用System.Web.Mvc命名空间,如下: public class ImageResult : ActionResult { public ImageFormat ContentType { get; set; } public Image image { get; set; } public strin

ASP.Net将图片以二进制方式存入数据库,并读取

把图片转换成二进制--把二进制转换成图片 private void button1_Click(object sender, EventArgs e) { string path = this.textBox1.Text; byte[] imgBytesIn = SaveImage(path); ShowImgByByte(imgBytesIn); //Parameters.Add("@Photo", SqlDbType.Binary).Value = imgBytesIn; } //

2018.7.30 Oracle的Bolog数据库类型读取和存储

package com.lanqiao.shopping.test; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream;