отображение двоичного потока, полученного из базы данных как "изображение" внутри 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
, а не один большой массив в памяти. Для небольших файлов разница неважна, но для очень больших файлов она может быть значительной (как в " Ура, теперь мой веб-сервер не падает уже не раз!" значительный.)