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

Noa*_*oah 3 asp.net ms-access ms-access-2007 web

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

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

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

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

Joe*_*ton 5

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

电话会看起来像:

<img src="showmyimages.aspx?image=id" />
Run Code Online (Sandbox Code Playgroud)

代码看起来有点像:

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();
}
Run Code Online (Sandbox Code Playgroud)

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

编辑:

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

编辑:

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

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();
                        }
                    }
                }
            }

        }
Run Code Online (Sandbox Code Playgroud)

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