Как зайти в Даркнет?!
25th January, 01:11
6
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
895
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
914
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4351
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4396
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Динамический рендеринг asp:Image из BLOB записи в ASP.NET
Вот чего я хочу добиться. Я хочу дать пользователю возможность загрузить файл изображения, сохранить изображение в BLOB на сервере SQL, а затем использовать это изображение в качестве логотипа на других страницах сайта.
Я сделал это с помощью
Response.Clear();
Response.ContentType = "image/pjpeg";
Response.BinaryWrite(imageConents);
Response.End();
но для этого я использую пользовательский элемент управления в том месте, где я хочу показать изображение. Я хочу сделать это, если это возможно, используя элемент управления asp:Image или даже чистый старый элемент управления html image. Разве это возможно?
Добавьте 'Generic Handler' в свой веб-проект, назовите его как-то вроде Image.ashx. Реализуйте его следующим образом:
public class ImageHandler : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
using(Image image = GetImage(context.Request.QueryString["ID"]))
{
context.Response.ContentType = "image/jpeg";
image.Save(context.Response.OutputStream, ImageFormat.Jpeg);
}
}
public bool IsReusable
{
get
{
return true;
}
}
}
Теперь просто реализуйте метод GetImage, чтобы загрузить изображение с заданным ID, и вы можете использовать
<asp:Image runat="server" ImageUrl="~/Image.ashx?ID=myImageId" />
отобразить ее. Вы также можете подумать о реализации некоторой формы кэширования в обработчике. И помните, если вы хотите изменить формат изображения на PNG, вам нужно использовать промежуточный MemoryStream (потому что PNGs требует сохранения искомого потока).
Вы можете BASE64 кодировать содержимое изображения непосредственно в атрибут SRC, однако я полагаю, что только Firefox будет анализировать это обратно в изображение.
Что я обычно делаю, так это создаю очень легкий HTTPHandler для обслуживания изображений:
using System;
using System.Web;
namespace Example
{
public class GetImage : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
if (context.Request.QueryString("id") != null)
{
Blob = GetBlobFromDataBase(id);
context.Response.Clear();
context.Response.ContentType = "image/pjpeg";
context.Response.BinaryWrite(Blob);
context.Response.End();
}
}
public bool IsReusable
{
get
{
return false;
}
}
}
}
Вы можете ссылаться на это непосредственно в своем теге img:
<img src="GetImage.ashx?id=111"/>
Или вы можете даже создать серверный элемент управления, который делает это за вас:
using System;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace Example.WebControl
{
[ToolboxData("<{0}:DatabaseImage runat=server></{0}:DatabaseImage>")]
public class DatabaseImage : Control
{
public int DatabaseId
{
get
{
if (ViewState["DatabaseId" + this.ID] == null)
return 0;
else
return ViewState["DataBaseId"];
}
set
{
ViewState["DatabaseId" + this.ID] = value;
}
}
protected override void RenderContents(HtmlTextWriter output)
{
output.Write("<img src='getImage.ashx?id=" + this.DatabaseId + "'/>");
base.RenderContents(output);
}
}
}
Это может быть использовано как
<cc:DatabaseImage id="db1" DatabaseId="123" runat="server/>
И, конечно, вы можете установить databaseId в кодовом поиске по мере необходимости.
Вы не хотите обслуживать большие двоичные объекты из базы данных без реализации кэширования на стороне клиента.
Для поддержки кэширования на стороне клиента вам потребуется обработать следующие заголовки:
- ETag
- Истекает
- Последнее Изменение
- Если-Совпадение
- If-None-Match
- If-Modified-Since
- If-Unmodified-Since
- Unless-Modified-Since
Для обработчика http, который делает это, проверьте: http://code.google.com/p/talifun-web/wiki/StaticFileHandler
У него есть хороший помощник для обслуживания контента. Он должен быть легко передан в потоке базы данных к нему. Он также выполняет кэширование на стороне сервера, что должно помочь облегчить некоторое давление на базу данных.
Если вы когда-нибудь решите обслуживать потоковое содержимое из базы данных, PDF-файлов или больших файлов, обработчик также поддерживает 206 частичных запросов.
Он также поддерживает gzip и сдувает сжатие.
Эти типы файлов выиграют от дальнейшего сжатия:
- css, js, htm, html, swf, xml, xslt, txt
- doc, xls, ppt
Есть некоторые типы файлов, которые не выиграют от дальнейшего сжатия:
- pdf (вызывает проблемы с некоторыми версиями в IE и обычно хорошо сжимается)
- png, формат JPG, jpeg, МФП, МГО
- wav, mp3, m4a, aac (wav часто сжимается)
- 3gp, 3g2, asf, avi, dv, flv, mov, mp4, mpg, mpeg, wmv
- zip, rar, 7z, arj
Используя ASP.Net с MVC, это довольно просто. Вы кодируете контроллер с помощью такого метода:
public FileContentResult Image(int id)
{
//Get data from database. The Image BLOB is return like byte[]
SomeLogic ItemsDB= new SomeLogic("[ImageId]=" + id.ToString());
FileContentResult MyImage = null;
if (ItemsDB.Count > 0)
{
MyImage= new FileContentResult(ItemsDB.Image, "image/jpg");
}
return MyImage;
}
В веб-представлении ASP.NET или в этом примере в веб-форме ASP.NET можно заполнить элемент управления изображением с помощью URL для вашего метода следующим образом:
this.imgExample.ImageUrl = "~/Items/Image/" + MyItem.Id.ToString();
this.imgExample.Height = new Unit(120);
this.imgExample.Width = new Unit(120);
Вот. Не так уж много хлопот было нужно.
Мы на самом деле только что выпустили несколько классов, которые помогают именно с такими вещами:
http://www.codeplex.com/aspnet/Release/ProjectReleases.aspx?ReleaseId=16449
В частности, проверьте образец DatabaseImage.