从数据库中检索图像并在没有httphandler的情况下在ASP.NET上显示

时间:2013-10-02 15:30:27

标签: c# asp.net sql

我有一个ASP.NET网站,我想输入EmployeeName,上传EmployeePhoto,然后检索员工信息并在网站上显示Employeephoto。

我用EmployeePhoto创建了一个SQL表 - 输入“image”。

我使用此代码插入照片(工作正常) 的 http://i.stack.imgur.com/qmphk.png

但是,当我想将我在SQL中插入的照片加载到网站时,我得到的这个Inputstream不存在错误。

加载照片代码&错误 http://i.stack.imgur.com/X2okW.png

我不想使用httphandler解决方案

编辑:我还没有正确答案:(

非常感谢。

            cnn.Open();
            SqlCommand cmd = new SqlCommand("SELECT EmployeeFirstName,EmployeeLastName,EmployeePhoto FROM Employees WHERE EmployeeID = @myvalue", cnn);
            cmd.Parameters.AddWithValue("@myvalue", (ListBox1.SelectedValue));
            SqlDataReader dr = cmd.ExecuteReader();
            if (dr.HasRows)
            {
                while (dr.Read())
                {
                    TextBox1.Text = dr.GetString(0);
                    TextBox2.Text = dr.GetString(1);


                    byte[] imagedata = (byte[])dr[2];
                    InputStream.Read(imagedata, 0, (byte[])dr[2]);
                    Image Image1 = Image.FromStream(imagedata);

                }
            }
            cnn.Close();

4 个答案:

答案 0 :(得分:2)

替换

                byte[] imagedata = (byte[])dr[2];
                InputStream.Read(imagedata, 0, (byte[])dr[2]);
                Image Image1 = Image.FromStream(imagedata);

                byte[] imagedata = (byte[])dr[2];
                Image Image1 = Image.FromStream(new MemoryStream(imagedata));

看起来错误正在发生,因为它无法找到您正在使用的InputStream对象。通过创建一个新的MemoryStream对象来绕过它。

此外,您将二进制数组传递到Image.FromStream,我认为这些数组不会被正确接受。

同样使用Image对象可能无法帮助您使用此解决方案,因为它与Image网络控件不同。

详见下文:

System.Drawing.Image

System.Web.UI.Controls.Image

答案 1 :(得分:1)

使用HTML的设计方式,您应该使用某种处理程序,因为HTML中的img标记指的是外部资源(例如src标记)。在最长的时间内,没有办法将图像包含在从服务器返回的HTML中。

话虽这么说,情况发生了变化,现在有可能。您可以使用特殊格式的src属性对图像进行base-64编码并将其包含在标记中:

<img src="data:<MIMETYPE>;base64,<BASE64_ENCODED_IMAGE>">

并非所有浏览器都支持此功能,因此请小心。

此外,这种方法的一个重大缺点是浏览器没有缓存图像,因此每次请求此页面时,服务器都会产生额外的开销来产生这个Base64值,而如果你有一个URL ,浏览器可以根据URL缓存图像,而不必在每次请求时从服务器获取它。

要获取Base64字符串,请使用静态方法System.Convert.ToBase64String(byte[])

答案 2 :(得分:-1)

那是因为没有名为InputStream的对象。

请改为尝试:

byte[] imagedata = (byte[])dr[2];
Image Image1 = Image.FromStream(new MemoryStream(imagedata));

这会将byte[]放入内存流,然后允许您使用Image.FromStream();

答案 3 :(得分:-1)

我相信这可行:

byte[] bitMapData = dr[2] as byte[] ?? null;

        if (bitMapData != null)
        {
            using (MemoryStream stream = new MemoryStream(bitMapData))
            {
                System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(stream);
            }
        }