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

时间:2012-01-16 12:44:41

标签: c# asp.net sql-server memorystream

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

存储过程

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

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

2 个答案:

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

答案 1 :(得分: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#有点生锈,我的代码是通过转换器运行的)。