图片 二进制 互转

时间:2023-01-04 10:21:25

图像二进制文件的操作(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();

    }
}