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.
Hiển thị cho chúng tôi cũng là nơi bạn chuyển byte sang 'ObjToImg' –
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
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. –