пятница, 17 декабря 2010 г.

Максимальное разрешение для загружаемых изображений

Одна из первых серьезных проблем, с которыми я столкнулась - невозможность ресайза картинок с высоким разрешением. Когда второй мой сайт на Drupal был уже почти готов, я перенесла его на глобальный хостинг, чтоб продолжить тестирование, и поняла, что ресурсов shared-хостинга едва хватит на ресайз картинки 2000х2000 пикселей. Я решила поставить ограничение на разрешение загружаемых картинок, однако Drupal работает так, что картинки, превышающие максимальное разрешение, просто уменьшаются, что как раз и является проблемой.

Как же сделать так, чтобы файл с разрешением, превышающим максимальное, просто запрещался для загрузки и пользователь видел сообщение о превышении допустимых параметров? Приведу свое решение, в случае использования для загрузки файлов модуля FileField.

Нам прийдется всего лишь закомментировать несколько строчек, это небольшое изменение и его легко отменить. Заходим в каталог модуля и открываем файл filefield.module. Находим функцию filefield_validate_image_resolution и комментируем две ветки условия, в которых производится попытка ресайза картинки:

// Try resizing the image with ImageAPI if available.
/* elseif (module_exists('imageapi') && imageapi_default_toolkit()) {
$res = imageapi_image_open($file->filepath);
imageapi_image_scale($res, $max_width, $max_height);
imageapi_image_close($res, $file->filepath);
$resized = TRUE;
} */
// Try to resize the image to fit the dimensions.
/* elseif (image_get_toolkit() && @image_scale($file->filepath, $file->filepath, $max_width, $max_height)) {
$resized = TRUE;
} */
Оставшая ветка как раз и будет возвращать необоходимое нам сообщение об ошибке.

Кроме того, я немного подправила информацию о максимальном разрешении, которая выводится возле поля для загрузки файла. В функции filefield_validate_image_resolution_help я нашла строку текста "Images larger than @max_size pixels will be scaled" и заменила на "Maximum allowed resolution: @max_size pixels".

Вот и все изменения!


Хочу также обратить внимание на то, что при использовании FileField для CCK-поля, максимальные значения нужно указывать в настройках этого конкретного поля (Администрирование - Типы материалов - Ваш_тип - Управление полями), а не в общих настройках "Загрузки файлов".