将图像文件保存到sql Server并将字节数组转换为图像

我将图像存储在数据库中,并希望将它们从字节数组转换为图像。 我没有问题将对象转换为字节数组但是在尝试从字节数组转换为图像时出现“参数无效”错误。 我传递给我的方法的对象来自数据集行。

存储过程

USE [----------------] GO /****** Object: StoredProcedure [dbo].[usp_imageloader_add_test] Script Date: 01/16/2012 09:19:46 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER procedure [dbo].[usp_imageloader_add_test] @p_Image Image as INSERT into Test_Images VALUES(@p_Image) 

上传文件控制 /将图像文件转换为字节数组并将数据保存到数据库

  protected void btnUpload_Click(object sender, EventArgs e) { if (ctrlUpload.PostedFile != null) { if (ctrlUpload.PostedFile.ContentLength > 0) { // Get Posted File HttpPostedFile objHttpPostedFile = ctrlUpload.PostedFile; // Find its length and convert it to byte array int ContentLength = objHttpPostedFile.ContentLength; // Create Byte Array byte[] bytImg = new byte[ContentLength]; // Read Uploaded file in Byte Array objHttpPostedFile.InputStream.Read(bytImg, 0, ContentLength); using (SqlConnection dbConnection = new SqlConnection(app_settings.sql_conn_string_db)) { try { string sql = "usp_imageloader_add_test"; SqlCommand cmd = new SqlCommand(sql, dbConnection); cmd.CommandType = System.Data.CommandType.StoredProcedure; cmd.Parameters.AddWithValue("@p_Image", bytImg).SqlDbType = SqlDbType.Binary; cmd.Connection.Open(); cmd.ExecuteNonQuery(); cmd.Connection.Close(); } catch (Exception ex) { ex.Message.ToString(); } } } } } 

调用objToImg方法的表方法

 protected void Page_Load(object sender, EventArgs e) { generateTable(false); } private Table generateTable(bool flag) { Table tb = BuildList(GetData(), flag); if (imgloadercms != null) { PlaceHolder ph = new PlaceHolder(); StringBuilder sb = new StringBuilder(); ph.Controls.Add(new LiteralControl(sb.ToString())); } imgloadercms.Controls.Add(tb); return tb; } protected Table BuildList(DataTable tb, bool flag) { Table tblImageLibrary = new Table(); tblImageLibrary.BorderStyle = BorderStyle.Solid; tblImageLibrary.BorderWidth = Unit.Pixel(8); if (tb.Rows.Count > 0) { try { if (!flag) { tblImageLibrary.BorderColor = Color.Black; tblImageLibrary.BorderWidth = Unit.Pixel(1); TableRow tr = new TableRow(); // Table row for header of table tr.BackColor = Color.LightBlue; TableCell c1 = new TableCell(); TableCell c2 = new TableCell(); c1.Controls.Add(new LiteralControl("Image Id")); tr.Cells.Add(c1); c2.Controls.Add(new LiteralControl("Image")); tr.Cells.Add(c2); tblImageLibrary.Rows.Add(tr); } int i = 0; foreach (DataRow r in tb.Rows) // Create new row foreach row in table { TableRow tr = new TableRow(); if (i % 2 == 0) { tr.BackColor = Color.LightYellow; } // Build cells TableCell c1 = new TableCell(); TableCell c2 = new TableCell(); c2.Width = 300; c1.Controls.Add(new LiteralControl(r["Image_Id"].ToString())); tr.Cells.Add(c1); // Call method to serialize obj to byte array //System.Drawing.Image dbImg = ObjToImg(r["Image_File"]); } catch (Exception ex) { ex.ToString(); } if (!flag) { } } return tblImageLibrary; } 

返回图片

  private System.Drawing.Image ObjToImg(object obj) { //byte[] byteArray = null; if (obj == null) return null; else { BinaryFormatter bf = new BinaryFormatter(); using (MemoryStream ms = new MemoryStream()) { bf.Serialize(ms, obj); //now in Memory Stream ms.ToArray(); // Array object ms.Seek(0, SeekOrigin.Begin); //return (System.Drawing.Image)bf.Deserialize(ms); System.Drawing.Image myImage = (System.Drawing.Image)bf.Deserialize(ms); return myImage; } 

每当我尝试将内存流对象添加到图像对象构造函数时,我都会收到“参数无效”的错误消息。 也许我在将字节数组插入数据库时​​犯了一个错误,因为我已经查看了其他代码,但它没有用,它是如何工作的。

尝试使用BinaryFormatter从字节数组中首先反序列化对象!

尝试使用以下两种方法:

 private System.Drawing.Image ObjToImg(byte[] obj) { if (obj == null) return null; else { BinaryFormatter bf = new BinaryFormatter(); using(MemoryStream ms = new MemoryStream(obj)) { return (System.Drawing.Image)bf.Deserialize(ms); } } } private byte[] ImgToObj(System.Drawing.Image obj) { if (obj == null) return null; else { BinaryFormatter bf = new BinaryFormatter(); using(MemoryStream ms = new MemoryStream()) { bf.Serialize(ms, obj); return ms.ToArray(); } } } 

我最近不得不在VB.NET中做同样的事情。 这是我的代码,通过Telerik的代码转换器运行。 上class非常棘手,老实说仍然很痛苦。

要上传图片:

 private bool uploadImage(ref Bitmap p) { SqlConnection con = new SqlConnection(); con.ConnectionString = Configuration.ConfigurationManager.ConnectionStrings("ConnStringHere").ConnectionString; SqlCommand cmd = new SqlCommand(); cmd.CommandText = "INSERT INTO Table_Name (File2) VALUES (@File2)"; //I named the column File2 simply because "File" seemed to be a keyword in SQLServer cmd.CommandType = CommandType.Text; cmd.Connection = con; SqlParameter File1 = new SqlParameter("@File2", SqlDbType.Image); MemoryStream ms = new MemoryStream(); using (Bitmap tempImage = new Bitmap(p)) { tempImage.Save(ms, p.RawFormat); } byte[] data = ms.GetBuffer(); if (!isValidImage(data)) //optional, will include code if requested. { return false; } File1.Value = data; cmd.Parameters.Add(File1); con.Open(); int result = cmd.ExecuteNonQuery(); if (result > 0) { // SUCCESS! con.Close(); return true; } else { //failure con.Close(); return false; } } 

要检索图像:

 private Bitmap retrieveBitmap() { Image image1 = null if (dt1.Rows.Count > 0) { byte[] imageData1 = null; if (dt1[0].Count > 0) { if (!Information.IsDBNull(dt1.CopyToDataTable()[0].Item("File2"))) { imageData1 = (byte[])dt1.CopyToDataTable()[0].Item("File2"); } } if ((imageData1 != null)) { if (isValidImage(imageData1)) { using (MemoryStream ms = new MemoryStream(imageData1, 0, imageData1.Length)) { ms.Write(imageData1, 0, imageData1.Length); image1 = Image.FromStream(ms, true); } return image1; } else { // "Invalid image on server"; return null; } } } } 

我的代码可能需要进行小的格式更改,请编辑任何语法无效的内容(我的C#有点生疏,我的代码是通过转换器运行的)。