C_图片转换成二进制流并且保存到数据库.doc
C#图片转换成二进制流并且保存到sql server数据库
悬赏分:提问时间:提问者:问题为何被关闭30 | 2010-5-19 16:54 | 594661005 |
谢谢大侠们了...来看看...急急急..
注意:我要存储文件二进制流的列的类型是text,不是image类型。
我已经实现了从数据库中读取text类型的二进制流,,现在就是不知道怎么存进
去.
我的部分关键代码:
StreamReader sr = new StreamReader(FilePath, System.Text.Encoding.GetEncoding("GB2312"), true); string filetext = sr.ReadLine();//这是要存进数据库的文件二进制流文本
他们告诉我具体该用FileStream这个类来读取...但是我不知道怎么用...
上面我的代码存到数据库后,我再读取出来二进制流转换成文件后,图片就无浏
览..估计是我的代码是没有读完二进制流就保存到数据库了...
说明:上面如果保存图片二进制流成功存到数据库后,在数据库看到的值可能是:
“BM 諪”是这样的..
我的这种方法是错误的...希望大家能帮我看看,应该怎么改...
非常感谢..
问题补充:
数据库存储二进制流的列的类型不是image,而是text类型 ,我的读取二进制
字符串已经可以转换成文件了...现在就是把二进制字符串保存到数据库的时候
有问题..
这是我把文件转换为二进制字符串的代码
string FilePath = this.openFileDialog1.FileName; //
得到文件路径
string filename = FilePath.Substring(FilePath.LastIndexOf("\\") + 1); //得到
上传文件的文名
string filetext =string.Empty;
FileStream fs = new FileStream(FilePath, FileMode.OpenOrCreate,
FileAccess.Read);
Byte[] fileByte = new Byte[(int)fs.Length];
fs.Read(fileByte, 0, fileByte.Length);
filetext = System.Text.Encoding.Default.GetString(fileByte); //将指定字节数组
中的说有字节解码为一个字符串
fs.Close();
其他回答 共4条
System.IO.FileStream fs = new System.IO.FileStream(图片路径,
FileMode.OpenOrCreate, FileAccess.Read);
byte[] fileByte = new byte[fs.Length];
fs.Read(fileByte, 0, (int)fs.Length);
然后将fileByte存到库里就行了。
回答者: kgdxpr | 四级 | 2010-5-19 16:59 text,你就当string处理就行了
思路就是先得到图片文件的对象,然后转成byte[]
然后转成string
text存储二进制文件不如image好,可能小文件速度变的慢
回答者: howeverlee | 五级 | 2010-5-19 17:04 FileStream stream;
IFormatter iFormatter = new BinaryFormatter();
stream = new FileStream("图片);
//序列化
formatter.Serialize(stream, "目标");
stream.Close();
//读取的时候用反序列化
formatter.Deserialize()
//转化为图片格式
回答者: hack6500 | 三级 | 2010-5-19 18:19 private Byte[] getphoto(string photopath) //读取照片文件到字节数组
{
string str = photopath;
FileStream file = new FileStream(str, FileMode.Open,
FileAccess.Read);
Byte[] byteData = new Byte[file.Length];
file.Read(byteData, 0, byteData.Length);
file.Close();
return byteData;
}
SQL Server下图片的插入与读取时间:2010-04-25 21:57:08来源:网络 作者:未知 点击:385次 下午向数据库SQL SERVER中遇到添加图片类型数据的问题,本以为在界面管理器中可以直接(通过指定路径把图片的数据保存起来)添加图片却不然。网上搜了下找到了相关的较专业的资料,整合解读一下:
下午向数据库SQL SERVER中遇到添加图片类型数据的问题,本以为在界面管理器中可以直接(通过指定路径把图片的数据保存起来)添加图片却不然。网上搜了下找到了相关的较专业的资料,整合解读一下:
两种方法:
第一就是在数据库中存储图片的路径,然后在程序中根据读取的路径读取图片;这种方法简单、容易使用,但是在图片过多时不好管理。
第二种就是将图片转换成二进制存储于数据库中,sql server 2005有个image数据类型,专门用于存储图片,Image数据类型存储的是长度不确定的二进制数据,最大长度是2GB。
第二种方法(详情请参阅:详述的过程)
简述过程:
当然首先得有存储图片字段的数据库、
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
。
如何插入图片:
大致
流程
快递问题件怎么处理流程河南自建厂房流程下载关于规范招聘需求审批流程制作流程表下载邮件下载流程设计
:其他图片格式--》image类型的转化--》到MemoryStream流的转换--》到二进制的转换--》插入到数据库。
如何得到图片:
大致流程:选取数据库中的image类型字段--》转化为二进制流--》转化为MemoryStream流--》转化为Image图片格式类型。
其它:如何插入读取一个文件、如何保存数据库中的image字段到一个文件。。
图片二进制互相转换C#
图片的常见存储与读取凡是有以下几种:
存储图片:以二进制的形式存储图片时,要把数据库中的字段设置为Image数据类型(SQL Server),存储的数据是Byte[].
1.参数是图片路径:返回Byte[]类型:
public byte[] GetPictureData(string imagepath) {
/**/////根据图片文件的路径使用文件流打开,并保存为byte[]
FileStream fs = new FileStream(imagepath, FileMode.Open);//可以是其他重载方法 byte[] byData = new byte[fs.Length]; fs.Read(byData, 0, byData.Length); fs.Close();
return byData;
}
2.参数类型是Image对象,返回Byte[]类型:
public byte[] PhotoImageInsert(System.Drawing.Image imgPhoto)
{
//将Image转换成流数据,并保存为byte[]
MemoryStream mstream = new MemoryStream(); imgPhoto.Save(mstream, System.Drawing.Imaging.ImageFormat.Bmp);
byte[] byData = new Byte[mstream.Length];
mstream.Position = 0;
mstream.Read(byData, 0, byData.Length);
mstream.Close();
return byData;
}
好了,这样通过上面的方法就可以把图片转换成Byte[]对象,然后就把这个对象保存到数据
库中去就实现了把图片的二进制格式保存到数据库中去了。下面我就谈谈如何把数据库中的
图片读取出来,实际上这是一个相反的过程。
读取图片:把相应的字段转换成Byte[]即:Byte[] bt=(Byte[])XXXX
1.参数是Byte[]类型,返回值是Image对象:
public System.Drawing.Image ReturnPhoto(byte[] streamByte) {
System.IO.MemoryStream ms = new System.IO.MemoryStream(streamByte);
System.Drawing.Image img = System.Drawing.Image.FromStream(ms);
return img;
}
2.参数是Byte[] 类型,没有返回值,这是针对asp.net中把图片从输出到网页上
(Response.BinaryWrite)
public void WritePhoto(byte[] streamByte) {
// Response.ContentType 的默认值为默认值为“text/html”
Response.ContentType = "image/GIF";
//图片输出的类型有: image/GIF image/JPEG
Response.BinaryWrite(streamByte);
}
补充:
针对Response.ContentType的值,除了针对图片的类型外,还有其他的类型:
Response.ContentType = "application/msword"; Response.ContentType = "application/x-shockwave-flash"; Response.ContentType = "application/vnd.ms-excel"; 另外可以针对不同的格式,用不同的输出类型以适合不同的类型:
switch (dataread("document_type"))
{
case "doc":
Response.ContentType = "application/msword"; case "swf":
Response.ContentType = "application/x-shockwave-flash"; case "xls":
Response.ContentType = "application/vnd.ms-excel"; case "gif":
Response.ContentType = "image/gif";
case "Jpg":
Response.ContentType = "image/jpeg";
}
========================================================================================================
二进制文件转换部分:
string strpath;
protected void Page_Load(object sender, EventArgs e)
{
strpath = HttpContext.Current.Request.PhysicalApplicationPath + "1.bmp";
}
//图片转成二进制
public byte[] getBytes(string filePath)
{
System.IO.FileStream fs = new System.IO.FileStream(filePath, System.IO.FileMode.Open);
byte[] imgData = new byte[fs.Length];
fs.Read(imgData, 0, (int)fs.Length);
return imgData;
}
//二进制转成图片
private System.Drawing.Image convertByteToImg(byte[] imgData)
{
System.IO.MemoryStream ms = new System.IO.MemoryStream(imgData);
System.Drawing.Image img = System.Drawing.Image.FromStream(ms);
return img;
}
protected void Button1_Click(object sender, EventArgs e)
{
//下面两行可将图片直接显示
//System.Drawing.Image img = convertByteToImg(getBytes(strpath));
//img.Save(Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
//下面几行代码将图片显示在IMAGE中
byte[] photo = getBytes(strpath);
//图片路径
string strPath = "2.JPG";
string strPhotoPath = Server.MapPath(strPath);
//保存图片文件
BinaryWriter bw = new
BinaryWriter(File.Open(strPhotoPath,FileMode.OpenOrCreate));
bw.Write(photo);
bw.Close();
//显示图片
this.Image1.ImageUrl = strPath;
}