Вопрос по вложениям

Проблемы с установкой или работой phpBB 3.0.x? Получите помощь здесь!
С 1 января 2017 года phpBB Group прекращает поддержку phpBB версии 3.0.
Сайт официальной русской поддержки phpBB Guru продолжит поддержку phpBB 3.0 до 1 июля 2017 года.
Подробнее: Окончание поддержки phpBB 3.0.
Правила форума
Местная Конституция | Шаблон запроса | Документация (phpBB3) | Переход на 3.0.6 и выше | FAQ-3 (phpbb3) | Как задавать вопросы | Как устанавливать моды

Ваш вопрос может быть удален без объяснения причин, если на него есть ответы по приведённым ссылкам (а вы рискуете получить предупреждение ;) ).
romeo_piter
phpBB 2.0.22
Сообщения: 1375
Стаж: 17 лет 5 месяцев
Благодарил (а): 260 раз
Поблагодарили: 32 раза

Вопрос по вложениям

Сообщение romeo_piter »

Правильно ли я понимаю, что сначала фотография заливается на сервер и лишь после этого происходит её проверка относительно настроек вложений в админке (вес, размер)?
Аватара пользователя
MIT
Former team member
Сообщения: 2500
Стаж: 17 лет 6 месяцев
Откуда: 56°20′02″ с. ш. 36°42′45″ в. д.
Благодарил (а): 3 раза
Поблагодарили: 351 раз

Re: Вопрос по вложениям

Сообщение MIT »

Протокол HTTP не предоставляет никаких иных механизмов по проверке вложений, кроме как отсечение запросов, общим размером больше оговоренного значения, поэтому проверка вложений производится следующим образом:
1) Все файлы загружаются на сервер. Обычно во временную папку /tmp/ и имеют имя типа phpXXXXXX.
2) Скрипт получает информацию о файлах, которую передал браузер: MIME-тип, размер, исходное имя, а так же путь к файлу на сервере.
3) Исходя из переданных параметров данный файл может быть проигнорирован, либо же подвергнут дальнейшей обработке.
4) Если файл полностью устроил скрипт, то он перемещается при помощи специальной функции из временной папки в папку, подконтрольную скрипту.
5) Файлы, которые не были перемещены, по окончанию работы скрипта удаляются с сервера.
romeo_piter
phpBB 2.0.22
Сообщения: 1375
Стаж: 17 лет 5 месяцев
Благодарил (а): 260 раз
Поблагодарили: 32 раза

Re: Вопрос по вложениям

Сообщение romeo_piter »

Гени(т)ально.

Таком образом. Любой форум элементарно можно положить постоянными попытками скармливания ему файлов по 50 метров?

Неужели нет никаких механизмов проверки до загрузки?
Аватара пользователя
MIT
Former team member
Сообщения: 2500
Стаж: 17 лет 6 месяцев
Откуда: 56°20′02″ с. ш. 36°42′45″ в. д.
Благодарил (а): 3 раза
Поблагодарили: 351 раз

Re: Вопрос по вложениям

Сообщение MIT »

romeo_piter писал(а):Любой форум элементарно можно положить постоянными попытками скармливания ему файлов по 50 метров?
Как? Особенно интересует момент с «элементарно».

Можно положить не форум, а веб-сервер отправкой одновременно большого количества тяжёлых slow-запросов, но это лечится грамотной настройкой, форум тут совершенно не при чём.
Отправкой сотни файлов маленького размера ты ничего не добьёшься, а от отправки впринципе больших запросов спасает лимитирование размера запроса, о чём я уже говорил выше. Такой лимит можно создать, например, указанием параметра post_max_size в php.ini. Размер запроса приходит на сервер вместе с прочими заголовками до тела запроса, поэтому тело может быть отсечено.
romeo_piter
phpBB 2.0.22
Сообщения: 1375
Стаж: 17 лет 5 месяцев
Благодарил (а): 260 раз
Поблагодарили: 32 раза

Re: Вопрос по вложениям

Сообщение romeo_piter »

Можно я немножко конкретизирую?

Вот это хак вешает сервер при попытке залить 4-10 метровое фото:
http://www.phpbb.com/community/viewtopi ... 6#p9652285

А он (хак) нужен мне принципиально, т.к.

1. облегчает жизнь юзверям неумеющим пользоваться даже тупым пэйнтом
2. делает текстовый ватермарк на вложение (ни один мод не предлагает такой возможности), все варианты "наложений" при помощи highslide и т.п. не накладывают реальный ватермарк.
3. Позволяет класть на сервер уменьшенные варианты фото.

Кроме того, из-за того что нельзя проверить размер вложения до отправки, я не могу поставить мультиаплоад, т.к. 3 файла 3000*3000 тоже повесят сервер.

Вот скажите, как мне быть? Как мне ограничить файлы до обработки скриптом, точнее, наверное, до загрузки на сервер?
Это ведь не свистелка и перделка (C), а это вполне разумный функционал.
Shredder
Former team member
Сообщения: 2266
Стаж: 17 лет 9 месяцев
Благодарил (а): 283 раза
Поблагодарили: 584 раза

Re: Вопрос по вложениям

Сообщение Shredder »

romeo_piter писал(а):Кроме того, из-за того что нельзя проверить размер вложения до отправки, я не могу поставить мультиаплоад, т.к. 3 файла 3000*3000 тоже повесят сервер.
У меня этот "хак" вешал сервер с одним таким файлом, без мультизагрузки.
romeo_piter
phpBB 2.0.22
Сообщения: 1375
Стаж: 17 лет 5 месяцев
Благодарил (а): 260 раз
Поблагодарили: 32 раза

Re: Вопрос по вложениям

Сообщение romeo_piter »

Такие файлы стали проходить после увеличения лимито памяти до 128.

Но суть не в этом. Всё равно это неправильно.
Аватара пользователя
Sheer
Former team member
Сообщения: 12113
Стаж: 19 лет 7 месяцев
Откуда: Калининград не Кенигсберг
Благодарил (а): 54 раза
Поблагодарили: 2756 раз

Re: Вопрос по вложениям

Сообщение Sheer »

romeo_piter писал(а): (ни один мод не предлагает такой возможности), все варианты "наложений" при помощи highslide и т.п. не накладывают реальный ватермарк.
Это неправда. Есть мод Advanced_Attach_Watermark_v.0.1.4 (есть недоделанный перевод на русский под слегка упрощенный вариант мода) (демо) совместимый с Multiple File Upload 1.0.1
Ставил его вместе с [dev] Upload image resizer
Изображение
Общие ошибки новичков (07.11.2005) & Как задавать вопросы
Мини FAQ
Если ничто другое не помогает, прочтите, наконец, инструкцию!
"Никакая инструкция не может перечислить всех обязанностей должностного лица, предусмотреть все отдельные случаи и дать вперёд соответствующие указания, а поэтому господа инженеры должны проявить инициативу и, руководствуясь знаниями своей специальности и пользой дела, принять все усилия для оправдания своего назначения".
Циркуляр Морского технического комитета №15 от 29.11.1910 г.
Аватара пользователя
MIT
Former team member
Сообщения: 2500
Стаж: 17 лет 6 месяцев
Откуда: 56°20′02″ с. ш. 36°42′45″ в. д.
Благодарил (а): 3 раза
Поблагодарили: 351 раз

Re: Вопрос по вложениям

Сообщение MIT »

romeo_piter писал(а):Вот скажите, как мне быть?
В общем случае — никак. Я тебе могу кинуть маленькую картинку (gif в 500 кб), которая повесит не только практически любой сервер, но и твой домашний компьютер при попытке её открыть, не говоря уже о редактировании.

Могу лишь дать несколько советов:
1) Порекомендовать пользователям не делать того, что вешает твой сервер
2) Увеличить количество оперативки на оном
3) Использовать ImageMagick вместо стандартного GD
romeo_piter
phpBB 2.0.22
Сообщения: 1375
Стаж: 17 лет 5 месяцев
Благодарил (а): 260 раз
Поблагодарили: 32 раза

Re: Вопрос по вложениям

Сообщение romeo_piter »

Sheer писал(а):
romeo_piter писал(а): (ни один мод не предлагает такой возможности), все варианты "наложений" при помощи highslide и т.п. не накладывают реальный ватермарк.
Это неправда. Есть мод Advanced_Attach_Watermark_v.0.1.4 (есть недоделанный перевод на русский под слегка упрощенный вариант мода) (демо) совместимый с Multiple File Upload 1.0.1
Ставил его вместе с [dev] Upload image resizer
Не совсем понял логику.
Вот это: [dev] Upload image resizer
по сути тот же хак, о котором я говорю из-за которого по сути все проблемы, немного перебранный, но суть та же, добавляем в него 3 строки и получаем текстовый ватермарк. Соответственно, нужда в моде Advanced_Attach_Watermark_v.0.1.4 автоматом отпадает.
И мы снова упираемся в то что я говорил, т.е. проблему с обработкой скриптом крупных фотографий и эта проблема становится ещё актуальнее при попытке использовать мультиаплоад.

Добавлено спустя 2 минуты 5 секунд:
MIT писал(а):1) Порекомендовать пользователям не делать того, что вешает твой сервер
Ну сами же понимаете, что это нереально )
MIT писал(а):2) Увеличить количество оперативки на оном
Кто-то из гуру на конфе советовал не ставить лимит выше 128.
MIT писал(а):3) Использовать ImageMagick вместо стандартного GD
Это я не в курсе, пойду почитаю.
Аватара пользователя
MIT
Former team member
Сообщения: 2500
Стаж: 17 лет 6 месяцев
Откуда: 56°20′02″ с. ш. 36°42′45″ в. д.
Благодарил (а): 3 раза
Поблагодарили: 351 раз

Re: Вопрос по вложениям

Сообщение MIT »

romeo_piter писал(а):Ну сами же понимаете, что это нереально )
Не рекомендуем загружать более трёх изображений с фотоаппарата за раз. В противном случае наш сайт не сможет их обработать, а вы потеряете несколько минут своей жизни на бессмысленное ожидание.
romeo_piter писал(а):не ставить лимит выше 128
Это общая рекомендация. Настройки выставляются из компромиса потребности и физических лимитов. Надо больше — ставь больше, если можешь поставить больше. Не можешь — не меняй, не надо — не увеличивай.
romeo_piter
phpBB 2.0.22
Сообщения: 1375
Стаж: 17 лет 5 месяцев
Благодарил (а): 260 раз
Поблагодарили: 32 раза

Re: Вопрос по вложениям

Сообщение romeo_piter »

MIT писал(а):Не рекомендуем загружать более трёх изображений с фотоаппарата за раз. В противном случае наш сайт не сможет их обработать, а вы потеряете несколько минут своей жизни на бессмысленное ожидание.
Это не проблема написать. Проблема, что не прочтут )
Берем 3 файла с 14 мп фотика без предварительной обработки и пытаемся выложить их на форум.
Вес каждого примерно 5 Мб, разрешение пусть будет 3000*3000
Т.е. на один файл надо минимум 90 Мб, для обработки 3-х файлов - почти 300 Мб.

Если позволяет оперативка сервера имеет смысл выделить лимит памяти в 300 Мб?
Аватара пользователя
MIT
Former team member
Сообщения: 2500
Стаж: 17 лет 6 месяцев
Откуда: 56°20′02″ с. ш. 36°42′45″ в. д.
Благодарил (а): 3 раза
Поблагодарили: 351 раз

Re: Вопрос по вложениям

Сообщение MIT »

romeo_piter, ну, я бы для начала попробовал заменить функцию resize_images, которую ты где-то нашёл, на вот такую:

Код: Выделить всё

/**
* Resize images with the true diemensions (800*600)
*/
function resize_images()
{
	if ($this->is_image()) {
		$width_max = 800;
		$height_max = 800;

		if ($size = getimagesize($this->destination_file))
		{
			$width = $size[0];
			$height = $size[1];

			if ($height > $height_max || $width > $width_max)
			{
				if ($width > $width_max)
				{
					$height = $height / ($width / $width_max);
					$width = $width_max;
				}
				if ($height > $height_max)
				{
					$width = $width / ($height / $height_max);
					$height = $height_max;
				}

				$source = false;

				switch($this->extension)
				{
					case 'jpg':
					case 'jpeg':
						$source = imagecreatefromjpeg($this->destination_file);
						break;
					
					case 'png':
						$source = imagecreatefrompng($this->destination_file);
						break;
					
					case 'gif':
						$source = imagecreatefromgif($this->destination_file);
						break;
						
				}
				
				if ($source)
				{
					$destination = imagecreatetruecolor($width, $height);

					imagecopyresampled($destination, $source, 0, 0, 0, 0, $width, $height, $size[0], $size[1]);
					
					switch($this->extension)
					{
						case 'jpg':
						case 'jpeg':
							imagejpeg($destination, $this->destination_file);
							break;

						case 'png':
							imagepng($destination, $this->destination_file);
							break;

						case 'gif':
							imagegif($destination, $this->destination_file);
							break;

					}
					
					imagedestroy($source);
					imagedestroy($destination);
				}
			}
		}
	}
}
romeo_piter
phpBB 2.0.22
Сообщения: 1375
Стаж: 17 лет 5 месяцев
Благодарил (а): 260 раз
Поблагодарили: 32 раза

Re: Вопрос по вложениям

Сообщение romeo_piter »

Дмитрий, я откровенно бессилен в php )
В чем преимущество вашего кода?

У меня код немного другой, посвежее, чем по ссылке, выглядит так (брал с этого форума):

Код: Выделить всё

/**
    * Resize images with the true diemensions
    * version 0.31
    */
    function resize_images()
    {
       if ( $this->is_image() )
       {
			$limit_width = 800;
			$limit_height = 768;
			$quality = 90;
			$size = getimagesize($this->destination_file);
			$width = $size[0];
			$height = $size[1];
			if($height > $limit_height OR $width > $limit_width)
			{
				$int_factor = min(($limit_width / $width), ($limit_height / $height));
				// pano-test add
				// if (max($width, $height) / min($width, $height) > 2) $int_factor = $int_factor * 1.5;
				// end
				$width = round($width * $int_factor);
				$height = round($height * $int_factor);
				$destination = imagecreatetruecolor($width, $height);
				if ( $this->extension == "jpg" || $this->extension == "jpeg" )
				{
					@ini_set('gd.jpeg_ignore_warning', 1);
					$source = imagecreatefromjpeg($this->destination_file);
				}
				elseif ( $this->extension == "png" )
				{
					@imagealphablending($destination, false);
					@imagesavealpha($destination, true);
					$source = imagecreatefrompng($this->destination_file);
				}
				elseif ( $this->extension == "gif" )
				{
					$source = imagecreatefromgif($this->destination_file);
					$trnprt_indx = imagecolortransparent($source);
					if ($trnprt_indx >= 0) //transparent
					{
						$trnprt_color = imagecolorsforindex($source, $trnprt_indx);
						$trnprt_indx = imagecolorallocate($destination, $trnprt_color['red'], $trnprt_color['green'], $trnprt_color['blue']);
						imagefill($destination, 0, 0, $trnprt_indx);
						imagecolortransparent($destination, $trnprt_indx);
					}
				}

				imagecopyresampled($destination, $source, 0, 0, 0, 0, $width, $height, $size[0], $size[1]);
$black = imagecolorallocate($destination,255,255,255);
$str = "www.mysite.ru";
imagestring($destination,5,8,4,$str, $black);
				if ( $this->extension == "jpg" || $this->extension == "jpeg" ) imagejpeg($destination, $this->destination_file, $quality);
				elseif ( $this->extension == "png" ) imagepng($destination, $this->destination_file);
				elseif ( $this->extension == "gif" ) imagegif($destination, $this->destination_file);
				imagedestroy($destination);
			}
		}
	}

Аватара пользователя
MIT
Former team member
Сообщения: 2500
Стаж: 17 лет 6 месяцев
Откуда: 56°20′02″ с. ш. 36°42′45″ в. д.
Благодарил (а): 3 раза
Поблагодарили: 351 раз

Re: Вопрос по вложениям

Сообщение MIT »

В моём коде есть проверка на корректность изображения + принудительное освобождение памяти. Ну и код написан по-человечески, хотя это мелочи...

Твой код лучше того, что приведено по ссылке, но кое-что я бы добавил. После строки

Код: Выделить всё

				imagedestroy($destination);
добавь

Код: Выделить всё

				imagedestroy($source);

Вернуться в «Поддержка phpBB 3.0.х»