2012-01-16 97 views
7

Tôi lưu trữ hình ảnh trong cơ sở dữ liệu và muốn chuyển đổi chúng từ mảng byte sang hình ảnh. Tôi không có vấn đề chuyển đổi một đối tượng thành mảng byte nhưng tôi nhận được một lỗi "Tham số không hợp lệ" khi cố gắng chuyển đổi từ mảng byte sang hình ảnh. Các đối tượng tôi đang đi đến phương pháp của tôi là từ một tập dữ liệu hàng.Lưu tệp hình ảnh vào sql Máy chủ và chuyển đổi mảng byte thành hình ảnh

Thủ tục lưu trữ

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) 

kiểm soát Upload File/chuyển đổi file hình ảnh sang mảng byte và lưu dữ liệu vào cơ sở dữ liệu

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

phương pháp Bảng trong đó kêu gọi phương pháp 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; 
    } 

Return ảnh

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

Bất cứ khi nào tôi cố gắng thêm các đối tượng dòng bộ nhớ để các nhà xây dựng đối tượng hình ảnh tôi nhận được thông báo lỗi của "Parameter là không hợp lệ". Có lẽ tôi đã thực hiện một sai lầm khi chèn mảng byte vào cơ sở dữ liệu bởi vì tôi đã xem xét mã khác và nó không có ý nghĩa như thế nào nó không hoạt động.

+0

Hiển thị cho chúng tôi cũng là nơi bạn chuyển byte sang 'ObjToImg' –

+0

Tôi có mã tương tự, trong đó tôi đã sử dụng' varbinary (max) 'thay vì' image'. EDIT: chỉ tìm thấy liên kết này cũng - http://stackoverflow.com/questions/4113294/is-there-a-big-technical-difference-between-varbinarymax-and-image-data-types – robasta

+0

Nó từ một hàng trong một bảng dữ liệu Tôi sẽ cập nhật bài đăng gốc của mình. –

Trả lời

1

Cố gắng deserialize đối tượng đầu tiên từ mảng byte với BinaryFormatter của bạn!

Cố gắng sử dụng sau đây hai phương pháp:

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 ban đầu được đặt thành Hình ảnh nhưng tôi đã không tạo ra sự khác biệt. –

+0

Tôi đã thử và nó đã ném một ngoại lệ của "cố gắng để deserialize một dòng sản phẩm nào". –

+0

Bạn chắc chắn mở một vấn đề với hoạt động với đầu ra của trình định dạng của bạn - hãy kiểm tra nó. –

1

Tôi chỉ vừa mới phải làm điều tương tự trong VB.NET. Đây là mã của tôi, chạy qua Bộ chuyển đổi mã của Telerik. Khá là khó để làm việc, và vẫn thực sự là một nỗi đau.

Để tải lên một hình ảnh:

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

} 

Để lấy một hình ảnh:

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

Mã của tôi có thể cần phải thay đổi định dạng nhỏ, xin vui lòng chỉnh sửa bất cứ điều gì có cú pháp hợp lệ (tôi C# là một chút gỉ, và mã của tôi đã được chạy qua bộ chuyển đổi).

Các vấn đề liên quan