本人是个新手,最近在搞那个图形码生成技术的时候遇到以下问题:
下面这段代码不是太理解,为什么要创建一个内存数据流,数据流有什么作用?
Response.ClearContent();为什么要清除缓冲区中的所有内容?还有最底下的那两句代码都不是太理解,求高手详细解答,谢谢!! System.IO.MemoryStream ms = new System.IO.MemoryStream();
image.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
Response.ClearContent();
Response.ContentType = "image/Gif";
Response.BinaryWrite(ms.ToArray());
下面这段代码不是太理解,为什么要创建一个内存数据流,数据流有什么作用?
Response.ClearContent();为什么要清除缓冲区中的所有内容?还有最底下的那两句代码都不是太理解,求高手详细解答,谢谢!! System.IO.MemoryStream ms = new System.IO.MemoryStream();
image.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
Response.ClearContent();
Response.ContentType = "image/Gif";
Response.BinaryWrite(ms.ToArray());
image.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);//把图片数据存入该内存流对象中 Response.ClearContent();//清空Response对象内容,至于为什么要清空它?因为你本身是向客户端输出图片数据的,图片数据必须很纯,不能掺杂其它无关的数据,你抽空去查一下Response对象是什么,它都有哪些属性,这些属性是什么值这样,比如Response.Cookies是一个属性集合;其二,你在输出前,可能会配置输出缓存机制,如context.Response.Cache.SetCacheability(HttpCacheability.Public);,清空它们,不至于造成错误,asp.net自身有缓存机制的Response.ContentType = "image/Gif";
Response.BinaryWrite(ms.ToArray());//输出,至于你问为什么要生成内存流对象,这里就是解释了,因为Response.BinaryWrite方法需要这么一种数据类型的参数,所以才要求你要生成那个内存对象//这里我给出另一种输出方式
image.Save(Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);//这里不用先把图片存入内存对象中,再把内存对象输出,我这里是直接把图片数据存入Response对象的OutputStream输出流(至于它底层怎么实现,我不去关心它了,楼主有兴趣自己去查看一下)
而流这个概念,你得去查下书或官方说明才行,好比Response.OutputStream,它作为一个输入流属性,它用于保存准备向远方的客户端输送的内容,比如把要输送的内容用二进制输出,那么,这些数据如果原先是另一种数据类型,比如开始的原始数据是十进制的或十六进制这些,那么我们得先把原妈内容转换了数据格式,保存到这个输出流属性中,以备后续输出。
具体怎么传送数据的,你得自己去看下网络工程方面的书才得,毕竟HTTP,TCP/IP这些专业术语要完全理解,不是简单的事。
官方称它为流,说明它与现实生活中的一些参照物为依据,流,让人想到的是流水,而数据通过网线传输,不正像自来水通过水管?当然,我只是说笑了,具体还得看书去理解。
毕竟真正的数据是怎样从网络的一端传输给远方的另一端的,这其中知识不少啊,好比一部400M大小数据的电影,不可能一次性从服务器传给远方IE,就好比一池水,不可能一下子从水管出来,流动中的传输