[英]Saving an Image file to sql Server and converting byte array into image
我將圖像存儲在數據庫中,並希望將它們從字節數組轉換為圖像。 我沒有問題將對象轉換為字節數組但是在嘗試從字節數組轉換為圖像時出現“參數無效”錯誤。 我傳遞給我的方法的對象來自數據集行。
存儲過程
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;
}
每當我嘗試將內存流對象添加到圖像對象構造函數時,我都會收到“參數無效”的錯誤消息。 也許我在將字節數組插入數據庫時犯了一個錯誤,因為我已經查看了其他代碼,但它沒有用,它是如何工作的。
我最近不得不在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#有點生銹,我的代碼是通過轉換器運行的)。
嘗試使用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();
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.