如何在asp.net页面上将数据库中的二进制列读入图像?

时间:2010-03-11 21:03:22

标签: c# asp.net

我想从数据库中读取我在二进制字段中存储图像并显示图像。

 while (reader.Read())
    {
        byte[] imgarr = (byte[])reader["file"];

        Stream s = new MemoryStream(imgarr);
        System.Drawing.Image image = System.Drawing.Image.FromStream(s);
        Graphics g = Graphics.FromImage(image);
        g.DrawImage(image, new Point(400, 10));
        image.Save(Response.OutputStream, ImageFormat.Jpeg);
        g.Dispose();
        image.Dispose();
    }
    con.Close();

这段代码不起作用:

 System.Drawing.Image image = System.Drawing.Image.FromStream(s);

我尝试了this article.中的代码 我得到了同样的错误“参数无效”。 也许我不知道某些东西,sql server或webconfig中的某些设置或者其他。有从数据库中获取图像的经验的其他人吗?

  

参数无效是   错误信息。   db表包含数据。   我究竟做错了什么?

4 个答案:

答案 0 :(得分:3)

 public Byte[] Ret_image(Int32 id)

    {

        SqlCommand cmd = new SqlCommand();

        cmd.CommandText = "select*from tbimage where imageid=@id";

        cmd.Connection = con;

        cmd.Parameters.Add("@id", SqlDbType.Int).Value = id;

        SqlDataReader dr = cmd.ExecuteReader();

        dr.Read();

        Byte[] ar = (Byte[])(dr[1]);

        dr.Close();

        cmd.Dispose();

        return ar;

    }

    protected void btnRetImage_Click(object sender, EventArgs e)

    {

        try

        {

            Byte[] ar = Ret_image(Convert.ToInt32(TextBox2.Text));

            String st = Server.MapPath("abc.jpg");

            FileStream fs = new FileStream(st, FileMode.Create, FileAccess.Write);

            fs.Write(ar, 0, ar.Length);

            fs.Close();

            Image1.Visible = true;

            Image1.ImageUrl = "abc.jpg";

            Label1.Visible = false;
}
catch(Expration exp)
{
 Label1.Text = "Wrong Image id";

            Label1.Visible = true;

            Image1.Visible = false;

        }

    }

}

答案 1 :(得分:0)

你说的行不起作用对我来说是正确的。由于你没有说出什么样的图像,也许它是一种不受支持的格式。

否则,我会猜测实际问题是在

byte[] imgarr = (byte[])reader["file"];

并且字节数组不包含您认为应该的数据。

答案 2 :(得分:0)

通常将Stream位置设置为0可以解决问题:

Stream s = new MemoryStream(imgarr);
s.Position = 0;

答案 3 :(得分:0)

您可能想要查看dbfile StaticSql.cs文件中包含您要查找的内容。

conn.Open();
SqlDataReader rdr = cmd.ExecuteReader();
if (rdr.Read())
{
    ... other code 

    byte[] filebytes = (byte[])rdr[FILE_STREAM];
    result.FileBytes = new byte[filebytes.Length];
    Array.Copy(filebytes, result.FileBytes, filebytes.Length);
}

DBFile.cs有文件编写代码

response.ContentType = file.ContentType;

byte[] buffer = new byte[file.ByteCount];
file.Read(buffer, 0, file.ByteCount);
response.BinaryWrite(buffer);

只要您在响应中设置内容类型并且您在响应中编写文件,就不需要创建图像然后保存它(除非您正在对其进行一些编辑)。