在运行ASP.NET的网站中,如何显示存储在MS Access 2007附件类型中的图像

时间:2010-06-18 12:48:28

标签: asp.net ms-access web ms-access-2007

背景
MS Access 2007添加了附件字段类型,可以存储图像 我正在使用ASP.Net和.NET framework 4构建一个网站

因此,在不使用Silverlight的情况下,从服务器上的Access数据库中检索图像的最简单方法是什么,并将其用作Image控件的源?

举个简单的例子:
在儿童ESL网站上,点击“A”,会显示一个苹果; “B”是熊等等

注意:这是A2007 / A2010附件字段,而不是二进制对象

1 个答案:

答案 0 :(得分:5)

您可以将数据库中的图像作为二进制blob读取。这将作为byte []数组读出。然后可以使用Response.BinaryWrite和内容类型的图像/(类型)将该字节[]发送到浏览器 - jpg / png / gif。

电话会看起来像:

<img src="showmyimages.aspx?image=id" />

代码看起来有点像:

result = myWebService.GetImage(id);

if (result != null) && result.Length > 0
{
    Context.Response.ClearContent();
    Context.Response.ClearHeaders();
    Context.Response.ContentType = "image/gif";
    Context.Response.AddHeader("Content-Length", result.Length.ToString(System.Globalization.CultureInfo.CurrentCulture));
    Context.Response.AddHeader("content-disposition", String.Format("inline; filename={0}.gif", filename));
    Context.Response.BinaryWrite(result);
    Context.Response.End();
}

这会稍微掩盖图像的文件名,但它允许直接从数据库中读取二进制文件,而不会在磁盘上显示永久图像。

编辑:

我读到的关于附件字段的所有内容都是它在数据库中存储为直接二进制文件,就像它直接保存到文件一样。我没有尝试为此效果编写任何代码,但可以想象,如果二进制数据可以输入StreamReader,甚至可以使用WebResponse.GetResponseStream()

,则无需转换。

编辑:

我能够使用以下代码实现处理程序,该代码实际从附件字段中提取二进制数据(可以在调试器中验证),但是似乎涉及的内置编码没有内置。似乎是检索fldImage.FileData的select语句。

public void ProcessRequest(HttpContext context)
        {

            string qry = "SELECT [Image], ID, [Images.Image.FileData] AS FileData, ";
            qry += "[Images.Image.FileName] AS FileName, [Images.Image.FileType] AS FileType";
            qry += " FROM Images WHERE (ID = 1)";
            string connect = @"Provider=Microsoft.ACE.OLEDB.12.0;Persist Security Info=False;Data Source=##PathToDB##\Database1.accdb";

            using (OleDbConnection conn = new OleDbConnection(connect))
            {
                if (context.Request.QueryString["id"] != null)
                {

                    OleDbCommand cmd = new OleDbCommand(qry, conn);
                    cmd.Parameters.AddWithValue("ID", context.Request.QueryString["id"]);
                    conn.Open();
                    using (OleDbDataReader rdr = cmd.ExecuteReader())
                    {
                        if (rdr.HasRows)
                        {
                            rdr.Read();
                            context.Response.ClearContent();
                            context.Response.ClearHeaders(); 
                            context.Response.ContentType = "image/" + rdr["FileType"];

                            byte[] result = Encoding.UTF8.GetBytes(rdr["FileData"].ToString());

                            context.Response.AddHeader("Content-Length",
                                result.Length.ToString(System.Globalization.CultureInfo.CurrentCulture)); 
                            context.Response.AddHeader("content-disposition", 
                                String.Format("attachment; filename={0}", rdr["FileName"]));
                            context.Response.BinaryWrite(result);
                            context.Response.End();
                        }
                    }
                }
            }

        }

还有一些方法位于MSDN Access Blog中描述的可能有用的Microsoft Office Interop库中。它们描述了加载和保存文件,但看起来它们似乎也可以直接执行相同的操作来流对象。引用是Microsoft.Office.Interop.Access.Dao。添加它时,转到COM选项卡并查找Microsoft Office 12.0 Access Database Engine Objects Library。我还没有测试过这种“直接流”理论。