отображение двоичного потока, полученного из базы данных как "изображение" внутри html в виде тега

Я пытаюсь отобразить изображение, которое извлекается из базы данных в виде двоичного потока, на веб-форму. Можешь пролить свет на это?

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

вот код, который я использовал, чтобы получить поток !

TestDBDataContext context1 = new TestDBDataContext();

            var r = (from a in context1.ImageTables where a.Id == 8 select a).First();

           MemoryStream stream = new MemoryStream(r.FileImage.ToArray());

спасибо

5 ответов


то, что я сделал в прошлом, это установить url-адрес изображения на страницу aspx, например:

<img src="getLogo.aspx" alt="Logo" />

затем, в код для getLogo.aspx, я сделал следующее:

Response.BinaryWrite( imageData );
Response.ContentType = "image/gif";

здесь imageData ваше изображение как массив байтов


Base64 кодирует ваш двоичный файл и вставляет в тег изображения следующим образом (измените тип mimetype на suit):

<img src="data:image/gif;base64,BASE64 ENCODED BINARY HERE">

вот как вы это сделаете, но я бы этого не сделал, так как некоторые браузеры не могут справиться с этим (IE6). Вам лучше сначала сохранить файл и сделать это обычным способом.


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


сохранить поток памяти в файл с помощью:

MemoryStream memoryStream = new MemoryStream();
     using (FileStream fileStream = new FileStream(FilePath, FileMode.Open, FileAccess.Write))
     {
       memoryStream.SaveTo(fileStream);
     }

затем поместите имя файла в html.


сначала есть отдельный .файл aspx для изображения (на самом деле я бы предпочел перегрузку IHttpHandler для этого, но принцип тот же, и давайте введем только одну новую концепцию за раз).

The .файл aspx будет просто наследовать от кода и не будет иметь содержимого. Так что у него будет <%@ Page %> директива и ничего больше.

в коде позади, в обработчике событий загрузки страницы, получите изображение и установите тип содержимого ответа на соответствующее значение (или, например, если все изображения являются image / png, вы можете просто жестко закодировать это). Затем запишите изображение на выход.

TestDBDataContext context1 = new TestDBDataContext();
int id;
if(int.TryParse(Request.QueryString["id"], out id))
{
  var r = (from a in context1.ImageTables where a.Id == 8 select a).FirstOrDefault();
  if(r != null)
  {
    Response.ContentType = r.ContentType;
    Response.BinaryWrite(r.FileImage.ToArray());
    return;
  }
}
//code to handle 404 not found for no such image here (send error message or Server.Transfer to error page, etc.

затем вы можете использовать это с <img src="profileImg.aspx?id=8" alt="" /> etc.

повышение производительности заключается в получении байтов по 4k за раз из базы данных и записи их в Response.OutputStream, а не один большой массив в памяти. Для небольших файлов разница неважна, но для очень больших файлов она может быть значительной (как в " Ура, теперь мой веб-сервер не падает уже не раз!" значительный.)