• 图片 二进制 互转


    图像二进制文件的操作(asp.net)

    一、操作要点:

    • 将文件转换为二进制,再将二进制转回为文件
    • 将文件写入到XML,再读出来显示或者还原
    • 将文件写入到数据库,再读取出来显示或者还原

    二、学习知识点:

    二进制操作的类:FileStream(文件流)、BinaryReader(二进制流读取器)、BinaryWriter(二进制流写入器)

     

    三、操作步骤:

    (1)新建类:fileToData.cs

    using System.IO;
    /// <summary>
    /// fileToData 的摘要说明
    /// </summary>
    public class fileToData
    {
     public fileToData() //构造函数
     { }
    /// <summary>
    /// 将传进来的文件转换成字符串(二进制)
    /// </summary>
        /// <param name=" FilePath">待处理的文件路径</param>
    /// <returns>String</returns>
        public static string FileToBinary(string FilePath)
        {
            FileStream fs=new FileStream(FilePath,FileMode.Open,FileAccess.Read);
            //利用新传来的路径实例化一个FileStream对象
            int filelength = Convert.ToInt32(fs.Length);
            //得到对象的大小
            Byte[] filebyteArray=new byte[filelength];
            //申明一个byte数组
            BinaryReader br = new BinaryReader(fs);
            //申明一个读取二进制流的BinaryReader对象
            for (int i = 0; i < filelength; i++)
            {   //循环数组大小那么多次
                br.Read(filebyteArray, 0, filelength); //第一个数组用0表示
                //将数据读取出来放在数组中
            }

            string strData = Convert.ToBase64String(filebyteArray);  //8位无符号整数数组ToBase64
            //将数组转换为String字符传
            return strData;
        }
        /// <summary>
        /// 将传进来的二进制字符串转换为图片文件
        /// </summary>
        /// <param name="path">保存的路径</param>
        /// <param name="Binary">需要转换的字符串</param>
        public static void BinaryToFile(string path,string Binary)
        {
            FileStream fs = new FileStream(path, FileMode.Create, FileAccess.Write);
            //利用新传来的路径实例化一个FileStream对象
            BinaryWriter bw = new BinaryWriter(fs);
            //实例化一个用于写的 BinaryWriter
            bw.Write(Convert.FromBase64String(Binary));
            //将传近来的二进制字符转换为8位无符号整数数组再写进去
            bw.Close();   //关闭二进制流写入器
            fs.Close();  //关闭文件流

        }
    }

    (2)将文件转换为二进制及二进制转换为文件的实现(ToBinary.aspx):

    public partial class toBinary : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            string a=fileToData.FileToBinary(Server.MapPath("~/图片1.gif")); //将图片1转换为二进制
            fileToData.BinaryToFile(Server.MapPath("~/图片2.gif"), a); //将二进制转换为图片2
        }
    }
    (3)新建类:FileToxml.cs

    加入命名空间:using System.IO;using System.Text;using System.Xml;

    /// <summary>
    /// 将文件转换为二进制
    /// </summary>
    public class FileToxml
    {
     public FileToxml()
     {
     }
        /// <summary>
        /// 从上传控件中
        /// </summary>
        /// <param name="fu">被加载了文件的FileUpload上传控件</param>
        /// <param name="xmlPath">XML文件的存放位置</param>
        /// <param name="id">图片的标识ID</param>
        public static void FileToXML(FileUpload fu,string xmlPath,Guid id)
        {
            if (fu.HasFile)
            { //先判断FileUpload对象中是否包含了文件
                string PathString = fu.FileName
                int FileLength = fu.PostedFile.ContentLength;  //只得出带扩展名的文件名

                try
                {
                    Byte[] FileByteArray = new byte[FileLenght];
                    //申明一个大小为文件总字节大的Byte数组以存放即将产生的二进制数据

                    Stream Streamobj = fu.PostedFile.InputStream;
                    //创建一个能够读取被上载文件内容的Stream对象

                    Streamobj.Read(FileByteArray, 0, FileLength);
                    //使用Stream对象的读取方法,参数说明将数据流存放在刚才申明的数组中,从0开始读,读取的字节数为全部

                   
                    XmlDocument xdom = new XmlDocument();                

                    if (!File.Exists(xmlPath))
                    {  //如果不存在XML,则创建

                    XmlDeclaration xdec = xdom.CreateXmlDeclaration("1.0", "utf-8", null);
                        xdom.AppendChild(xdec);                             //创建第一行声明

                    XmlElement Root = xdom.CreateElement("File");          //创建根节点File
                        xdom.AppendChild(Root);

                    XmlElement RootElement = xdom.CreateElement("Image"); //创建父节点Image
                        Root.AppendChild(RootElement);

                    XmlElement childElementId = xdom.CreateElement("Guid");    //图片标识字段
                        childElementId.InnerText = id.ToString();
                        //将传近来的GUID编号作为他的串联值
                        RootElement.AppendChild(childElementId);

                    XmlElement childElementImgSize = xdom.CreateElement("size");//文件大小字段
                        childElementImgSize.InnerText = FileLength.ToString(); 
                        RootElement.AppendChild(childElementImgSize);

                    XmlElement childElementImgData = xdom.CreateElement("imgData"); //图片信息
                        childElementImgData.InnerText = Convert.ToBase64String(FileByteArray);
                        //这句是关键,将上面的数组转换为字符串存起来
                        RootElement.AppendChild(childElementImgData);

                        xdom.Save(xmlPath);
                        //将上面创建的构架保存到指定的xml文件中
                    }
                    else
                    {  //如果XML文件存在的话就直接查找对应的节点,然后增加
                        xdom.Load(xmlPath); //加载xml文档
                        //将指定的XML文件读取到XMLdocument对象中

                        XmlNode root = xdom.SelectSingleNode("File");
                        //使用xpath表达式来查找到匹配条件的节点,我们这里当然是指根节点了

                        XmlElement RootElement = xdom.CreateElement("Image");
                        root.AppendChild(RootElement);
                        //创建父节点

                       

                        XmlElement childElementId = xdom.CreateElement("Guid");//图片标识字段
                       childElementId.InnerText = id.ToString();//将传近来的GUID编号作为他的串联值
                        RootElement.AppendChild(childElementId);

                        XmlElement childElementImgSize = xdom.CreateElement("size");
                        childElementImgSize.InnerText = FileLenght.ToString();//文件大小字段
                        RootElement.AppendChild(childElementImgSize);

                        XmlElement childElementImgData = xdom.CreateElement("imgData");
                        childElementImgData.InnerText = Convert.ToBase64String(fu.FileBytes);
                        RootElement.AppendChild(childElementImgData);

                        xdom.Save(xmlPath);
                        //将上面创建的构架保存到指定的xml文件中
                    }
                }
                catch (Exception e)
                {
                    throw e;
                }
            }
        }
    }
    (4)将图像文件写入到XML,再读出来显示或者还原(fileToxml.aspx):

    public partial class fileToxml : System.Web.UI.Page
    {
        protected void Button1_Click(object sender, EventArgs e)
        {//(上传按钮)将文件写入XML中去
            string xmlpath = Server.MapPath("~/App_Data/imgxml.xml");
            Guid gid = Guid.NewGuid();
            FileToxml.FileToXML(FileUpload1, xmlpath, gid);

            Session["gid"] = gid;
        }
        protected void Button2_Click(object sender, EventArgs e)
        { //根据Gid索取图片来显示
           ReadImgFromXml((Guid)Session["gid"]);
        }
        private void ReadImgFromXml(Guid gid)
        {
            XmlDocument xdom = new XmlDocument();
            xdom.Load(Server.MapPath("~/App_Data/imgxml.xml"));

           

            XmlNodeList xnl = xdom.SelectSingleNode(" //Image[Guid='" + gid.ToString() + "']").ChildNodes;  //找出GUID=我们传进来的ID的那一个节点的所有子节点
            for (int i = 0; i < xnl.Count; i++)
            {
                string imgdata = xnl.Item(2).InnerText; //节点第三项imgdata
                Response.OutputStream.Write(Convert.FromBase64String(imgdata), 0, imgdata.Length);
                Response.End();//从0开始到指定的长度输出打印所有的imgdata图像信息
            }
        }
        protected void Button3_Click(object sender, EventArgs e)
        { //从XML中读出再转换为文件
            XmlDocument xdom = new XmlDocument();
            xdom.Load(Server.MapPath("~/App_Data/imgxml.xml"));

            XmlNodeList xnl = xdom.SelectSingleNode(" //Image[Guid='" + Session["gid"].ToString() + "']" ).ChildNodes;
            for (int i = 0; i < xnl.Count; i++)
            {
                string strData = xnl.Item(2).InnerText;
                FileStream fs = new FileStream(Server.MapPath("~/图像文件名.gif"), FileMode.Create, FileAccess.Write);
                BinaryWriter bw = new BinaryWriter(fs);
                bw.Write(Convert.FromBase64String(strData));
                bw.Close();
                fs.Close();
            }
            Image1.ImageUrl = "~/图像文件名.gif";
        }
    }
    (5)将图像文件写入到数据库,再读取出来显示或者还原(ToData.aspx)

    public partial class ToData : System.Web.UI.Page
    {
        protected void Button1_Click(object sender, EventArgs e)
        {

            Guid gid=Guid.NewGuid();
            SqlConnection conn=new SqlConnection(ConfigurationManager.ConnectionStrings["数据源名称"].ConnectionString);
            conn.Open();
            //注意:二进制不能采用字符串相加的方式写入数据库

            SqlCommand cmd = new SqlCommand("Insert into img(gid,fileData) values(@gid ,@fileArray) ", conn);  //新建一个表img,添加字段名gid,fileData,下面添加字段类型
            cmd.Parameters.Add(" @gid", SqlDbType.UniqueIdentifier).Value = gid;
            cmd.Parameters.Add(" @fileArray", SqlDbType.Image).Value = FileUpload1.FileBytes;
            cmd.ExecuteNonQuery(); //执行SQL语句,返回影响行数
            conn.Close();

            Session["gid"] = gid; //保存gid的值
        }
        protected void Button2_Click(object sender, EventArgs e)
        {
            SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["数据源名称"].ConnectionString);
            conn.Open();
            SqlCommand cmd = new SqlCommand("select fileDat from img where gid='"+Session["gid"].ToString()+"'" , conn);
            byte[] fbt=(byte[])cmd.ExecuteScalar();
            conn.Close();

            Response.OutputStream.Write(fbt, 0, fbt.Length);
            Response.End();

        }
    }

  • 相关阅读:
    Linux 6 修改ssh默认远程端口号
    win7安装镜像注入USB3.0,NVMe驱动
    Spring Cloud(7):Zuul自定义过滤器和接口限流
    Spring Cloud(6):Zuul的基本使用
    Spring Cloud(5):Hystrix的使用
    Spring Cloud(4):Feign的使用
    Spring Cloud(3):Ribbon的使用
    Spring Cloud(2):搭建Eureka
    Spring Cloud(1):微服务简介
    SpringBoot 2.x (15):Actuator监控
  • 原文地址:https://www.cnblogs.com/Li-yuan/p/4809612.html
Copyright © 2020-2023  润新知