На веб-сайте с ASP.NET, как я могу отобразить изображение, хранящееся в типе вложений MS Access 2007 - PullRequest
3 голосов
/ 18 июня 2010

ФОН:
В MS Access 2007 добавлен тип поля вложения, в котором можно хранить изображения.
Я создаю веб-сайт с использованием ASP.Net и .NET framework 4

Итак, без использования Silverlight, какой самый простой способ извлечь изображение из базы данных Access на сервере и использовать в качестве источника для элемента управления изображением?

В качестве простого примера:
Inна веб-сайте ESL для детей, нажав на «А», будет отображаться яблоко;"B" медведь и т. Д.

ПРИМЕЧАНИЕ: Это поле вложения A2007 / A2010, а не двоичный объект

1 Ответ

5 голосов
/ 18 июня 2010

Вы можете прочитать изображение из базы данных в виде двоичного двоичного объекта. Это будет считано как массив byte []. Затем этот байт [] можно отправить в браузер с помощью Response.BinaryWrite и типа содержимого изображения / (type) - 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();
}

Это немного маскирует имя файла изображения, но позволяет двоичному чтению считываться непосредственно из базы данных без постоянного образа на диске.

EDIT:

Все, что я прочитал о поле вложения, заключается в том, что оно хранится в базе данных как прямой двоичный файл так же, как если бы оно сохранялось непосредственно в файл. Я не пытался написать какой-либо код для этого, но вполне возможно, что преобразование не требуется, если двоичные данные могут быть переданы в StreamReader, возможно даже с использованием WebResponse.GetResponseStream()

EDIT:

Мне удалось реализовать обработчик, используя следующий код, который фактически извлекал двоичные данные из поля вложения (что можно проверить в отладчике), однако, по-видимому, существует вовлеченная кодировка, которая не встроена. Ключ кажется, что оператор выбора, который получает 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();
                        }
                    }
                }
            }

        }

В библиотеке Microsoft Office Interop также описаны некоторые методы, описанные в MSDN Access Blog , которые могут быть полезны. Они описывают загрузку и сохранение файлов, но похоже, что они также могут выполнять те же действия непосредственно для потоковых объектов. Ссылка Microsoft.Office.Interop.Access.Dao. При добавлении перейдите на вкладку COM и найдите Microsoft Office 12.0 Access Database Engine Objects Library. Я не проверял эту теорию "прямо в поток".

...