从数据库中检索未显示在页面上的图像

时间:2014-01-02 16:25:51

标签: c# asp.net image

我已经能够以二进制格式将图像上传到sql server。这是我用来上传它的代码..

protected void Button2_Click(object sender, EventArgs e)
    {
        if (FileUpload1.HasFile)
        {
            string filename = FileUpload1.FileName;

            Stream imgStream = FileUpload1.PostedFile.InputStream;
            int imgLen = FileUpload1.PostedFile.ContentLength;
            byte[] imgBinaryData = new byte[imgLen];

            string strCm = "s_PictInsert";
            SqlCommand cm = new SqlCommand(strCm, Cn);
            cm.CommandType = CommandType.StoredProcedure;

            cm.Parameters.Add(new SqlParameter("@TheImage", SqlDbType.Image)).Value = imgBinaryData;



            Cn.Open();
            cm.ExecuteNonQuery();
            Cn.Close();
        }
    }

当我查看数据库时,我在数据库中看到的所有我上传的图片都是0x00000000000000等...我不知道为什么它看起来像......

然后我使用此代码检索图像..

protected void Button3_Click(object sender, EventArgs e)
    {
        string strCm = "select TheImage from [Pictures] where PictureID = 2";
        SqlCommand cm = new SqlCommand(strCm, Cn);
        cm.CommandType = CommandType.Text;

        Cn.Open();
        SqlDataReader dr = cm.ExecuteReader();
        if (dr.Read())
        {
            Response.ContentType = "image/jpg";
            Response.BinaryWrite((byte[])dr["TheImage"]);
        }
        Cn.Close();
    }

当我点击按钮时它没有显示图像,只是将标记写到页面上。

我想要做的是检索图像并将其放到asp图像中,我上传的图像可能是.png格式。

我只使用了response.binarywrite,因为这就是我的表现。但它不像我被告知的那样有效。

由于

3 个答案:

答案 0 :(得分:1)

问题在于您的上传功能,您没有使用文件流中的数据设置imgBinaryData,您只需设置匹配的大小,因此默认为全零。

而不是这部分:

byte[] imgBinaryData = new byte[imgLen];

替换为:

byte[] imgBinaryData = null;
using (var reader = new BinaryReader(FileUpload1.PostedFile.InputStream))
{
    imgBinaryData = reader.ReadBytes(FileUpload1.PostedFile.ContentLength);
}

然后检查您的数据库数据是什么样的。

另外,我建议在将文件存储到数据库时始终存储文件名和MIME类型,您永远不知道何时需要它们!

答案 1 :(得分:1)

试试这个:

var length = FileUpload1.PostedFile.ContentLength;
Byte[] imgBinaryData = new Byte[length];
var stream = FileUpload1.FileContent;
stream.Read(imgBinaryData, 0, length);

然后插入二进制对象。您的代码不会将图像读入流中以进行插入。上面的代码应该将图像读入字节数组,然后你的db代码应该插入实际数据而不是占位符。

答案 2 :(得分:1)

您正在以二进制格式将图像存储到数据库中,您将检索相同的图像。您需要使用MemoryStream从您检索的字节数组中获取图像。

看到这个: Retrieve image from database and display on ASP.NET without httphandler