Вопрос по вложениям
Правила форума
Местная Конституция | Шаблон запроса | Документация (phpBB3) | Переход на 3.0.6 и выше | FAQ-3 (phpbb3) | Как задавать вопросы | Как устанавливать моды
Ваш вопрос может быть удален без объяснения причин, если на него есть ответы по приведённым ссылкам (а вы рискуете получить предупреждение
).
Местная Конституция | Шаблон запроса | Документация (phpBB3) | Переход на 3.0.6 и выше | FAQ-3 (phpbb3) | Как задавать вопросы | Как устанавливать моды
Ваш вопрос может быть удален без объяснения причин, если на него есть ответы по приведённым ссылкам (а вы рискуете получить предупреждение
-
romeo_piter
- phpBB 2.0.22
- Сообщения: 1375
- Стаж: 17 лет 5 месяцев
- Благодарил (а): 260 раз
- Поблагодарили: 32 раза
Вопрос по вложениям
Правильно ли я понимаю, что сначала фотография заливается на сервер и лишь после этого происходит её проверка относительно настроек вложений в админке (вес, размер)?
-
MIT
- Former team member
- Сообщения: 2500
- Стаж: 17 лет 6 месяцев
- Откуда: 56°20′02″ с. ш. 36°42′45″ в. д.
- Благодарил (а): 3 раза
- Поблагодарили: 351 раз
Re: Вопрос по вложениям
Протокол HTTP не предоставляет никаких иных механизмов по проверке вложений, кроме как отсечение запросов, общим размером больше оговоренного значения, поэтому проверка вложений производится следующим образом:
1) Все файлы загружаются на сервер. Обычно во временную папку /tmp/ и имеют имя типа phpXXXXXX.
2) Скрипт получает информацию о файлах, которую передал браузер: MIME-тип, размер, исходное имя, а так же путь к файлу на сервере.
3) Исходя из переданных параметров данный файл может быть проигнорирован, либо же подвергнут дальнейшей обработке.
4) Если файл полностью устроил скрипт, то он перемещается при помощи специальной функции из временной папки в папку, подконтрольную скрипту.
5) Файлы, которые не были перемещены, по окончанию работы скрипта удаляются с сервера.
1) Все файлы загружаются на сервер. Обычно во временную папку /tmp/ и имеют имя типа phpXXXXXX.
2) Скрипт получает информацию о файлах, которую передал браузер: MIME-тип, размер, исходное имя, а так же путь к файлу на сервере.
3) Исходя из переданных параметров данный файл может быть проигнорирован, либо же подвергнут дальнейшей обработке.
4) Если файл полностью устроил скрипт, то он перемещается при помощи специальной функции из временной папки в папку, подконтрольную скрипту.
5) Файлы, которые не были перемещены, по окончанию работы скрипта удаляются с сервера.
-
romeo_piter
- phpBB 2.0.22
- Сообщения: 1375
- Стаж: 17 лет 5 месяцев
- Благодарил (а): 260 раз
- Поблагодарили: 32 раза
Re: Вопрос по вложениям
Гени(т)ально.
Таком образом. Любой форум элементарно можно положить постоянными попытками скармливания ему файлов по 50 метров?
Неужели нет никаких механизмов проверки до загрузки?
Таком образом. Любой форум элементарно можно положить постоянными попытками скармливания ему файлов по 50 метров?
Неужели нет никаких механизмов проверки до загрузки?
-
MIT
- Former team member
- Сообщения: 2500
- Стаж: 17 лет 6 месяцев
- Откуда: 56°20′02″ с. ш. 36°42′45″ в. д.
- Благодарил (а): 3 раза
- Поблагодарили: 351 раз
Re: Вопрос по вложениям
Как? Особенно интересует момент с «элементарно».romeo_piter писал(а):Любой форум элементарно можно положить постоянными попытками скармливания ему файлов по 50 метров?
Можно положить не форум, а веб-сервер отправкой одновременно большого количества тяжёлых slow-запросов, но это лечится грамотной настройкой, форум тут совершенно не при чём.
Отправкой сотни файлов маленького размера ты ничего не добьёшься, а от отправки впринципе больших запросов спасает лимитирование размера запроса, о чём я уже говорил выше. Такой лимит можно создать, например, указанием параметра
post_max_size в php.ini. Размер запроса приходит на сервер вместе с прочими заголовками до тела запроса, поэтому тело может быть отсечено.-
romeo_piter
- phpBB 2.0.22
- Сообщения: 1375
- Стаж: 17 лет 5 месяцев
- Благодарил (а): 260 раз
- Поблагодарили: 32 раза
Re: Вопрос по вложениям
Можно я немножко конкретизирую?
Вот это хак вешает сервер при попытке залить 4-10 метровое фото:
http://www.phpbb.com/community/viewtopi ... 6#p9652285
А он (хак) нужен мне принципиально, т.к.
1. облегчает жизнь юзверям неумеющим пользоваться даже тупым пэйнтом
2. делает текстовый ватермарк на вложение (ни один мод не предлагает такой возможности), все варианты "наложений" при помощи highslide и т.п. не накладывают реальный ватермарк.
3. Позволяет класть на сервер уменьшенные варианты фото.
Кроме того, из-за того что нельзя проверить размер вложения до отправки, я не могу поставить мультиаплоад, т.к. 3 файла 3000*3000 тоже повесят сервер.
Вот скажите, как мне быть? Как мне ограничить файлы до обработки скриптом, точнее, наверное, до загрузки на сервер?
Это ведь не свистелка и перделка (C), а это вполне разумный функционал.
Вот это хак вешает сервер при попытке залить 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: Вопрос по вложениям
У меня этот "хак" вешал сервер с одним таким файлом, без мультизагрузки.romeo_piter писал(а):Кроме того, из-за того что нельзя проверить размер вложения до отправки, я не могу поставить мультиаплоад, т.к. 3 файла 3000*3000 тоже повесят сервер.
-
romeo_piter
- phpBB 2.0.22
- Сообщения: 1375
- Стаж: 17 лет 5 месяцев
- Благодарил (а): 260 раз
- Поблагодарили: 32 раза
Re: Вопрос по вложениям
Такие файлы стали проходить после увеличения лимито памяти до 128.
Но суть не в этом. Всё равно это неправильно.
Но суть не в этом. Всё равно это неправильно.
-
Sheer
- Former team member
- Сообщения: 12113
- Стаж: 19 лет 7 месяцев
- Откуда: Калининград не Кенигсберг
- Благодарил (а): 54 раза
- Поблагодарили: 2756 раз
Re: Вопрос по вложениям
Это неправда. Есть мод Advanced_Attach_Watermark_v.0.1.4 (есть недоделанный перевод на русский под слегка упрощенный вариант мода) (демо) совместимый с Multiple File Upload 1.0.1romeo_piter писал(а): (ни один мод не предлагает такой возможности), все варианты "наложений" при помощи highslide и т.п. не накладывают реальный ватермарк.
Ставил его вместе с [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: Вопрос по вложениям
В общем случае — никак. Я тебе могу кинуть маленькую картинку (gif в 500 кб), которая повесит не только практически любой сервер, но и твой домашний компьютер при попытке её открыть, не говоря уже о редактировании.romeo_piter писал(а):Вот скажите, как мне быть?
Могу лишь дать несколько советов:
1) Порекомендовать пользователям не делать того, что вешает твой сервер
2) Увеличить количество оперативки на оном
3) Использовать ImageMagick вместо стандартного GD
-
romeo_piter
- phpBB 2.0.22
- Сообщения: 1375
- Стаж: 17 лет 5 месяцев
- Благодарил (а): 260 раз
- Поблагодарили: 32 раза
Re: Вопрос по вложениям
Не совсем понял логику.Sheer писал(а):Это неправда. Есть мод Advanced_Attach_Watermark_v.0.1.4 (есть недоделанный перевод на русский под слегка упрощенный вариант мода) (демо) совместимый с Multiple File Upload 1.0.1romeo_piter писал(а): (ни один мод не предлагает такой возможности), все варианты "наложений" при помощи highslide и т.п. не накладывают реальный ватермарк.
Ставил его вместе с [dev] Upload image resizer
Вот это: [dev] Upload image resizer
по сути тот же хак, о котором я говорю из-за которого по сути все проблемы, немного перебранный, но суть та же, добавляем в него 3 строки и получаем текстовый ватермарк. Соответственно, нужда в моде Advanced_Attach_Watermark_v.0.1.4 автоматом отпадает.
И мы снова упираемся в то что я говорил, т.е. проблему с обработкой скриптом крупных фотографий и эта проблема становится ещё актуальнее при попытке использовать мультиаплоад.
Добавлено спустя 2 минуты 5 секунд:
Ну сами же понимаете, что это нереально )MIT писал(а):1) Порекомендовать пользователям не делать того, что вешает твой сервер
Кто-то из гуру на конфе советовал не ставить лимит выше 128.MIT писал(а):2) Увеличить количество оперативки на оном
Это я не в курсе, пойду почитаю.MIT писал(а):3) Использовать ImageMagick вместо стандартного GD
-
MIT
- Former team member
- Сообщения: 2500
- Стаж: 17 лет 6 месяцев
- Откуда: 56°20′02″ с. ш. 36°42′45″ в. д.
- Благодарил (а): 3 раза
- Поблагодарили: 351 раз
Re: Вопрос по вложениям
Не рекомендуем загружать более трёх изображений с фотоаппарата за раз. В противном случае наш сайт не сможет их обработать, а вы потеряете несколько минут своей жизни на бессмысленное ожидание.romeo_piter писал(а):Ну сами же понимаете, что это нереально )
Это общая рекомендация. Настройки выставляются из компромиса потребности и физических лимитов. Надо больше — ставь больше, если можешь поставить больше. Не можешь — не меняй, не надо — не увеличивай.romeo_piter писал(а):не ставить лимит выше 128
-
romeo_piter
- phpBB 2.0.22
- Сообщения: 1375
- Стаж: 17 лет 5 месяцев
- Благодарил (а): 260 раз
- Поблагодарили: 32 раза
Re: Вопрос по вложениям
Это не проблема написать. Проблема, что не прочтут )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: Вопрос по вложениям
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: Вопрос по вложениям
Дмитрий, я откровенно бессилен в 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: Вопрос по вложениям
В моём коде есть проверка на корректность изображения + принудительное освобождение памяти. Ну и код написан по-человечески, хотя это мелочи...
Твой код лучше того, что приведено по ссылке, но кое-что я бы добавил. После строкидобавь
Твой код лучше того, что приведено по ссылке, но кое-что я бы добавил. После строки
Код: Выделить всё
imagedestroy($destination);Код: Выделить всё
imagedestroy($source);
