Проекты

ImageHandler

Обработчик картинок с возможностью ресайза, кеширования и рисования водяных знаков.

Установка

Перед первым использованием обработчик необходимо настроить.

  1. Необходимо добавить сборку ImageHandler.dll в reference (ссылки) проекта.
  2. Прописать в файле Web.config регистрацию обработчика и необходимые ключи. Для регистрации:
    • Для IIS<7
      ...
      	<system.web>
      		<httpHandlers>
      			...
      			<add path="ImageHandler.axd" verb="GET" type="AlphaOmega.Web.UI.ImageHandler, ImageHandler"/>
      			...
      		</httpHandlers>
      ...
      	</system.web>
      
    • Для IIS7+
      ...
      	<system.webServer>
      		<handlers>
      			<add name="ImageHandler" path="ImageHandler.axd" verb="GET" type="AlphaOmega.Web.UI.ImageHandler, ImageHandler"/>
      		</handlers>
      	</system.webServer>
      
  3. С версии 2.x изменён способ конфигурирования сборки. Для регистрации теперь необходимо прописать новую конфигурационную секцию:

    <configSections>
        ...
        <section name="ImageHandler" type="AlphaOmega.Web.UI.Config.SectionConfig, ImageHandler, Culture=neutral"/>
    </configSections>

    После этого, можно использовать новую секцию:

    <configuration>
        ...
        <ImageHandler watermark="AlphaOmega" notFoundImage="~\img\noimage.jpg">
            <cache path="~/Cache" createSubDirs="true"/>
        </ImageHandler>
        ...

    Способ конфигурирования сборки версии 1.х до версии 2.х

    <appSettings>
        ...
    <add key="ImageHandler.Cache.Folder" value="~/Cache"/>
    <add key="ImageHandler.NotFoundImage" value="~\img\noimage.jpg"/>
    <add key="ImageHandler.WaterMark" value="AlphaOmega"/>
        ...
    </appSettings>
    • path (ImageHandler.Cache.Folder) — Папка для кеширования изображений. В папке создаются изображения в формате: .\{MethodType}\{Width}x{Height}\
    • createSubDirs — Если подпапка для размера изображения не создана, то будет создана при первом запросе изображения с указанными шириной и высотой. (В предыдущей версии папка создавалась в любом случае)
    • watermark (ImageHandler.WaterMark) — Текст для водяного знака. Пока водяной знак рисуется по одному алгоритму.
    • notFoundImage (ImageHandler.NotFoundImage) — Изображение, которое отдаётся в случае, если метод не поддерживается или метод не вернул ничего.

Использование

На этом интеграция обработчика в проекте завершена. Теперь необходимо зарегистрировать события для обработчика. Для примера, зарегистрируем обработчик в файле Global.asax:

public class Global : System.Web.HttpApplication
{
	protected void Application_Start(Object sender, EventArgs e)
	{
		ImageBll bll = new ImageBll();
	}
}

Далее код класса ImageBll:

using System;
using AlphaOmega.Web.UI;

public class ImageBll
{
	public ImageBll()
	{
		HandlerCollection storage = ImageHandlerMethods.Handlers;
		// Для этого метода вызов будет таким http://localhost/ImageHandler.axd?MethodType=0&Size=100x100&Key=100
		storage.AddHandler(//Изображение товара
			0,//Идентификатор метода, который передаётся через QueryString
			ImageMethod.Infinity,//Время кешироваия в часах. Если параметр null, то изображения не кешируются. Если параметр ImageMethod.Infinity, то кеширование безвременное.
			true,//Необходимо нарисовать водяной знак. Водяной знак рисоваться если результатирующее изображение больше 251x251.
			null,//Делегат на рисование изображения в памяти
			GetProductStream//Делегат на рисование изображения с файловой системы
		);
		// Для этого метода вызов будет таким http://localhost/ImageHandler.axd?MethodType=0&Key=200
		storage.AddHandler(//Полосковый код
			1,//Идентификатор метода, который передаётся через QueryString
			null,//Время кешироваия в часах. Изображение кешировать не надо.
			false,//Водяной знак рисовать не надо.
			GetBarcode,//Делегат на рисование изображения в памяти
			null//Делегат на рисование изображения с файловой системы
		);
...
	}
	public Stream GetProductStream(Object sender, ImageEventArgs e)
	{
		if(String.IsNullOrEmpty(e.ImageKey))
			return null;
		else
			return GetImageStream(AppConfiguration.ImageHandler.AccesoryPathArg, e.ImageKey);
	}
	public Bitmap GetBarcode(Object sender, ImageEventArgs e)
	{
		if(String.IsNullOrEmpty(e.ImageKey))
			return null;
		else
			return (Bitmap)Code128.MakeBarcodeImage(e.ImageKey, 2, true);
	}
}
  • Зарегистрировать метод получения изображения можно через класс ImageMethod, передав его в ImageHandlerMethods.Handlers.AddHandler(...) в отличии от кода выше, создание экземпляра класса ImageMethod позволяет указать массив разрешённых размеров по которым можно ресайзить оригинальное изображение
  • Если зарегистрировать оба делегата onImage и onFile, то сначала будет запрос к делегату onFile. Если он вернёт null, то будет запрошен делегат onImage.
  • Метод получения изображения может указать свойство Cancel аргументов ImageEventArgs в true. В таком случае, обработчик изображения не будет ничего отдавать. Т.е. за отдачу будет полностью ответственен метод получения изображения.

TODO

  1. Добавить поддержку etag'а ^
  2. Добавить событие рисования водяных знаков для всех методов. Сейчас рисование водяного знака происходит по одному и тому же алгоритму.
  3. Добавить метод удаления изображения(й) из кеша.
Теги:

Скачать

  • 6 февраля 2013 г.
    Если путь к файлу в свойстве notFoundImage не задан, то при отсутствии изображения вылетала ошибка. Теперь в ответ уходит статус 404.
  • 13 ноября 2012 г.
    • Изменён способ конфигурации сборки (см. пп. "Установка")
    • В аргументы метода теперь передаётся 2 дополнительных свойства: CachedFile (FileInfo) и UseCachedFile (Boolean).
    • Исзпользуются заголовок Last-Modified и If-Modified-Since. В случае, если файл в кеше не изменился, то клиент получит Response.StatusCode = 304 (Not modified)
  • 14 июня 2012 г.
    Изменён Path.GetInvalidFileNameChars() на Path.GetInvalidDirectoryChars().
  • 9 июня 2012 г.
    Исправлена ошибка в методе удаления символов Path.GetInvalidFileNameChars() из файлов создаваемых в кеше.
  • 6 апреля 2012 г.
    Изменены делегаты. Теперь первый делегат принимает поток (Stream), а второй принимает Bitmap.
  • 12 марта 2012 г.
    1. Исправлена ошибка с кешированием на клиенте по заголовку Expires на 1 год.
      Теперь кешируется по времени кеширования метода.
    2. Исправлено время кеширования. Теперь оно в TimeSpan'е.
  • 7 марта 2012 г.
    Первый публичный релиз