Вы можете прочитать изображение из базы данных в виде двоичного двоичного объекта. Это будет считано как массив 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
. Я не проверял эту теорию "прямо в поток".