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