使用c#从SQL Server数据库保存和检索图像

时间:2013-04-28 09:40:29

标签: c# asp.net sql image sql-server-2005

我创建了一个网页,我使用Image控件来显示图像。除了这个控件,我还有一些标签和输入框

以下是我用于将图像保存到数据库的代码

byte[] imageSize = new byte[FileUpload1.PostedFile.ContentLength];
HttpPostedFile uploadedImage = FileUpload1.PostedFile;
uploadedImage.InputStream.Read(imageSize, 0, (int)FileUpload1.PostedFile.ContentLength);

SqlParameter UploadedImage = new SqlParameter("@image", SqlDbType.Image, imageSize.Length);
UploadedImage.Value = imageSize;

string sql = "insert into imageDB(Image) values (@image)";

using (SqlCommand cmd = new SqlCommand(sql, conn))
{
   cmd.Parameters.Add(UploadedImage);
   cmd.ExecuteNonQuery();
}

及以下是我用来从数据库中检索图像的代码

byte[] rawImg = (byte[])rdr["image"];
MemoryStream Stream = new MemoryStream();
Stream.Write(rawImg, 0, rawImg.Length);
Bitmap Display_Picture = new Bitmap(Stream);
//after this no idea how to proceed

我已经阅读了一些建议我们无法将此字节信息设置为Image控件的链接。

让我知道我从数据库中检索图像的方式是否正确,如果正确,我应该使用什么类型的控件,以便从数据库中检索到的图像可以显示在网页上

3 个答案:

答案 0 :(得分:1)

我的方法是从数据库中检索图像吗?

我会使用以下代码(抱歉未经测试):

byte[] imageBytes = Convert.FromBase64String(rdr["image"]);
MemoryStream stream = new MemoryStream(imageBytes);
Image image = Image.FromStream(stream);

如何将图像绑定到asp.net图像控件?

我会创建一个获取并返回图像的HttpHandler。然后将asp:Image上的ImageUrl属性绑定到HttpHandler的url。 你怎么能这样做,你可以在Dale Ragan的答案中看到:How to bind a MemoryStream to asp:image control?

答案 1 :(得分:0)

首先,在您的示例中,您必须将流中的位置重置为0:Stream.Position = 0;

其次,您必须将图像写入Web服务的本地缓存文件夹,该文件夹是Web应用程序的一部分。图像控件可以有一个Source-reference(img.src)到该图像的地址。

或者......你可以创建一个AXD文件/ HttpHandler。 AXD文件是一个文件,就像ASPX一样,但专门用于返回任何类型的数据,如图像。

有关详细信息,请参阅:http://blog.kurtschindler.net/post/using-httphandlers-to-serve-image-files

答案 2 :(得分:0)

要检索图像,并在asp.net图像控件上显示,您可以

    cn.Open();
    SqlCommand cm = new SqlCommand("select * from ImageCollection where img_id='" + DropDownList1.SelectedItem.ToString() + "'", cn);
    SqlDataAdapter da = new SqlDataAdapter(cm);
    SqlDataReader dr = cm.ExecuteReader();
    try
    {
        if (dr.Read())
        {

            string image1 = Convert.ToString(DateTime.Now.ToFileTime());
            FileStream fs1 = new FileStream(image1, FileMode.CreateNew, FileAccess.Write);
            byte[] bimage1 = (byte[])dr["passport_photo"];
            fs1.Write(bimage1, 0, bimage1.Length - 1);
            fs1.Flush();
            Image1.ImageUrl = "~/images/"+DropDownList1.SelectedItem.ToString();
        }
        dr.Close();
        cn.Close();
    }
    catch (Exception ex)
    {
        throw ex;
    }

替代解决方案:

实施处理程序以提供图像。看看System.Web.IHttpHandler界面。

我们的想法是在页面中按照以下方式编写图像标记:

<asp:image runat="server" imageurl="~/Image.ashx?ID=xxx" />

然后在你的处理程序实现中,从查询字符串中获取id,检索你正在做的图像,然后直接写入响应流。