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

本文关键字:图像 字节数 数组 转换 字节 Server 文件 保存 sql | 更新日期: 2023-09-27 18:20:29

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

存储过程

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

每当我试图将内存流对象添加到图像对象构造函数时,我都会收到"Parameter is not valid"的错误消息。也许我在将字节数组插入数据库时犯了一个错误,因为我已经查看了其他代码,但它不起作用是没有意义的。

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

尝试使用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的代码转换器运行。这是一个相当棘手的开始工作,老实说仍然是一个痛苦。

上传图像:

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#有点生疏,我的代码是通过转换器运行的)。