Ограничение разрешения изображений при загрузке

17 янв. 2014 г., 23:29:13
Просмотры: 18.1K
Голосов: 7

У меня возникает проблема, когда особенно большое изображение вызывает перезагрузку моего VPS сервера из-за проблем с памятью. Конфигурация этого механизма не в моих руках, это что-то вроде защитного механизма хостинга.

У меня VPS с 300Мб памяти, что, как я считаю, достаточно для моей установки WordPress, по крайней мере для повседневных операций.

Изображение, которое я загружаю, не особо большое по размеру файла (~380 Кб) и в основном черное с белыми буквами. Однако его разрешение составляет 4583 * 4583 пикселей. Когда я загружаю его через WordPress, я получаю HTTP-ошибку в окне загрузки, а когда проверяю живой сайт, он недоступен в течение пары минут.

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

Было бы еще лучше, если бы ограничение могло основываться на битах на пиксель изображения, но я не знаю, каков предел моего сервера для этого, поэтому, думаю, сообщение об ошибке, говорящее, что изображение не может быть загружено, потому что оно больше, скажем, 2000 * 2000, будет достаточным.

0
Все ответы на вопрос 4
0
13

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

Когда WordPress начинает "обработку" изображений, именно здесь вступает в действие PHP, который начинает изменять размеры и обрезать загруженные изображения. Именно перед этим моментом вам нужно вмешаться и выполнить несколько проверок, прежде чем позволить PHP использовать вашу память.

Используя фильтр wp_handle_upload_prefilter, вы можете подключить функцию, которая выполнит любые проверки изображения перед его обработкой:

<?php 
/* Утилиты Marc Dingena
 * Проверка разрешения изображения перед обработкой
 */
add_filter('wp_handle_upload_prefilter','mdu_validate_image_size');
function mdu_validate_image_size( $file ) {
    $image = getimagesize($file['tmp_name']);
    $minimum = array(
        'width' => '400',
        'height' => '400'
    );
    $maximum = array(
        'width' => '2000',
        'height' => '2000'
    );
    $image_width = $image[0];
    $image_height = $image[1];

    $too_small = "Размеры изображения слишком малы. Минимальный размер — {$minimum['width']} на {$minimum['height']} пикселей. Загруженное изображение имеет размер $image_width на $image_height пикселей.";
    $too_large = "Размеры изображения слишком велики. Максимальный размер — {$maximum['width']} на {$maximum['height']} пикселей. Загруженное изображение имеет размер $image_width на $image_height пикселей.";

    if ( $image_width < $minimum['width'] || $image_height < $minimum['height'] ) {
        // Добавляем сообщение об ошибке в массив $file
        $file['error'] = $too_small; 
        return $file;
    }
    elseif ( $image_width > $maximum['width'] || $image_height > $maximum['height'] ) {
        // Добавляем сообщение об ошибке в массив $file
        $file['error'] = $too_large; 
        return $file;
    }
    else
        return $file;
}
?>
17 янв. 2014 г. 23:29:13
2

Для плагина попробуйте http://wordpress.org/plugins/imsanity/, который поможет предотвратить загрузку слишком больших изображений другими пользователями сайта.

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

17 янв. 2014 г. 23:54:07
Комментарии

Что касается потребления памяти PHP в WordPress при обработке изображений, как бы вы сравнили этот плагин? Не приведет ли этот плагин к такой же нагрузке на сервер?

Marc Dingena Marc Dingena
18 янв. 2014 г. 00:04:33

Этот плагин хорош для уменьшения общего используемого дискового пространства из-за загрузки очень больших исходных изображений, но вопрос был не об этом. Imsanity не решает проблему, когда исходная загрузка не обрабатывается из-за слишком больших размеров изображения в пикселях, что приводит к нехватке памяти в PHP.

squarecandy squarecandy
25 янв. 2017 г. 04:56:26
0

Возможно, что на вашем сервере достаточно памяти для выполнения задачи, но установленный лимит памяти в PHP слишком мал для обработки очень больших изображений.

Попробуйте увеличить значение memory_limit в файле php.ini.

memory_limit=256M

*Примечание: В некоторых хостинг-средах это может быть не лучшим решением.

25 янв. 2017 г. 05:32:06
0

Для плагина попробуйте https://es.wordpress.org/plugins/cheetaho-image-optimizer/, он поможет предотвратить загрузку изображений слишком большого размера другими пользователями сайта.

8 мая 2024 г. 04:53:54