2012-01-16 31 views
7

我將圖像存儲在數據庫中,並希望將它們從字節數組轉換爲圖像。我沒有任何問題將對象轉換爲字節數組,但當嘗試從字節數組轉換爲圖像時,出現「參數無效」的錯誤。我傳遞給我的方法的對象來自數據集行。將圖像文件保存到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) 

上載文件控制 /圖像文件轉換爲字節陣列和數據保存到數據庫,該數據庫調用objToImg方法

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(); 
        } 
       } 
      } 
     } 
    } 

表方法

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; 
      } 

每當我試着內存流對象添加到圖像對象的構造函數,我得到的錯誤消息「參數無效」。也許我在將字節數組插入到數據庫時犯了一個錯誤,因爲我查看了其他代碼,並且它沒有任何意義。

+0

向我們展示您將字節傳遞給'ObjToImg'的位置 –

+0

我有類似的代碼,其中我使用'varbinary(max)'而不是'image'。編輯:剛剛發現這個鏈接也 - - http://stackoverflow.com/questions/4113294/is-there-a-big-technical-difference-between-varbinarymax-and-image-data-types – robasta

+0

它從一排在一個數據表我會更新我原來的帖子。 –

回答

1

嘗試使用反序列化首先從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(); 
      } 
     } 
    } 
+0

SqlDbType最初設置爲Image,但我沒有什麼區別。 –

+0

我試過了,它拋出了「嘗試反序列化一個空流」的異常。 –

+0

您肯定會在格式化程序的輸出中出現問題,請檢查它。 –

1

我最近剛剛做同樣的事情在VB.NET。這是我的代碼,通過Telerik的代碼轉換器運行。工作起來相當棘手,但仍然是一個痛苦。

要上傳圖像:

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#是有點生疏,和我的代碼是通過轉換器運行)。

相關問題