отображать двоичный поток, извлеченный из базы данных, как «изображение» внутри HTML как тег <img> - PullRequest
6 голосов
/ 16 декабря 2011

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

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

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

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 ]

8 голосов
/ 16 декабря 2011

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

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

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

4 голосов
/ 16 декабря 2011

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

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

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

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

Где imageData - ваше изображение в виде байтового массива

3 голосов
/ 16 декабря 2011

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

1 голос
/ 16 декабря 2011

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

Файл .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="" /> и т. Д.

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

1 голос
/ 16 декабря 2011

Сохранить поток памяти в файл, используя:

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

Затем введите имя файла в html.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...