Наверное ни для кого не секрет, что в JomSocial есть 2 варианта загрузки фотографий: обычный и flashuploader.
Немного теории. Итак, когда мы закачиваем фотографии с помощью обычного загрузчика, наш скрипт начинает тянуть через сеть к себе в папку весь ваш файл (размером, к примеру, 10 Мб). Тут уже возникает несколько проблем:
1. траффик (как вашего хостера, за который вы потом платите, так и пользователя, который платит за Мб, пользуясь вашим сайтом)
2. время загрузки CPU (да-да, я столкнулся с этим недавно у своего хостера, при загрузке файлов на сервер, даже если размер их допустим, но файл качается долго, например, из-за медленного коннекта, то сервер обрубает выполнения скрипта из-за длительной нагрузки на проц. )
3. ограничение сервера на максимальный размер загружаемого файла
4. да элементарно время ожидания вашего пользователя, ему ведь может и надоесть ждать закачки фотографии в галерею и он уйдет
5. и что-то ещё в том же духе...
Окей, ваш юзер оказался терпеливым, а хостинг жирным, картинка таки попала к вам на сервер. Дальше скрипт начинает производить одному ему только известные манипуляции для того, чтобы уменьшить вашу картинку, ведь вам совсем не хочется в дальнейшем выдавать пользователю гигантскую картинку, которая опять таки съест его и ваш трафик, да ещё и с дизайном могут возникнуть проблемы, он элементарно разъедется от негабаритной картинки. Так вот, на этом этапе возникает ещё одна существенная проблема:
1. Нагрузка на сервер, и достаточно ощутимая нагрузка, ведь чтобы уменьшить фотографию с 8-10 мегапиксельного фотоаппарата даже вашему локальному фотошопу понадобится немало ресурсов, а теперь представьте что будет если на вашем сайт десятки тысяч пользователей из которых несколько сотен в данный момент загрузили фотографию и сайт её уменьшает. (если сложно представить, просто откройте у себя 100 копий фотошопа на ПК и начните уменьшать в них фотографии). Но хостеры то у нас не дураки, они нам выделяют лимитированную память для использования и ограничение на время выполнения скрипта, поэтому в такой ситуации скорее всего ваша социалка просто откажется работать и вы потеряете посетителей, чего бы совсем не хотелось...
Флеш-загрузчикВ чем же принципиальное отличие флеш-загрузчика от обычного? Ну, файлы он также помещает на сервер, как и обычный, здесь различия нет и быть не должно, другое дело, как он это делает. Флеш работает на стороне клиента, а обычный, как мы уже поняли из вышесказанного, на стороне сервера. Т.е. логично предположить, что флешь использует ресурсы ПК клиента, а не сервера и это может сыграть нам большую пользу. Хотя на данный момент разработчики JomSocial используют Флеш только в качестве оболочки для диалога загрузки файлов и никаких особенных преимуществ нам это не дает.
А вот продвинутые товарищи с сайта
http://www.swfupload.org/ уже придумали, как
изменять размер изображения на стороне клиента и закачивать на сервер уже уменьшенные картинки. Да, да вы не ослышались! И при этом мы получаем:
Использование ресурсов сервера - минимальное
использование дискового пространства сервера - минимальное
время закачки и обработки - минимальное! Решил сегодня проверить у себя на сервере, 20 изображений с расширением 3263х2448 пикселей и размером по 3-4 Мб (порядка 70 Мб в сумме), я закачал за несколько минут и хостер этого даже не заметил!
Уже захотели себе такую штуку?
Тогда приступим:
Прикручиваем чудоштуку к JomSocialНачнем с шаблона. идем в папку шаблона, находим там файл: photos.flashuploader.php, находим там кусок кода:
custom_settings : {
progressTarget : "uploadProgress",
cancelButtonId : "btnCancel",
},
заменяем его на:
custom_settings : {
progressTarget : "uploadProgress",
cancelButtonId : "btnCancel",
thumbnail_width: 640,
thumbnail_height: 480,
thumbnail_quality: 80
},
Это и есть самые важные параметры, которым отвечают за максимальную высоту, ширину и качество наших изображений. (
ВНИМАНИЕ, пока корректно работает только с ресайзом не больше чем 640х480)
Далее идем в папку com_community/assets/uploader/ и находим там handlers.js в нем находим строку 89
заменяем её на:
this.startResizedUpload(this.getFile(0).ID, this.customSettings.thumbnail_width, this.customSettings.thumbnail_height, SWFUpload.RESIZE_ENCODING.JPEG, this.customSettings.thumbnail_quality, false);
теперь идем по ссылкам ниже и качаем файлик:
http://swfupload.googlecode.com/files/SWFUpload_v250_beta_3_core.zipнаходим в архиве 2 файлика из папки
swfupload_fp10:
1.swfupload.js
2.swfupload.swfи 1 файлик из папки
plugins 1.swfupload.queue.js2 первых файла закачиваем поверх старых в папку com_community/assets/uploader/
третий файл нужно переименовать в queue.js и закинуть в папку com_community/assets/uploader/plugins/ поверх старого, но это ещё не все, его нужно открыть и найти в нем строку 88
и заменяем её на:
this.startResizedUpload(this.getFile(0).ID, this.customSettings.thumbnail_width, this.customSettings.thumbnail_height, SWFUpload.RESIZE_ENCODING.JPEG, this.customSettings.thumbnail_quality, false);
Последний и самый ответственный шаг: включаем в админке JomSocial флеш загрузчик и тестируем. Должно работать, хотя сам флеш загрузчик сейчас находится в бета-стадии, так что от глюков никто не застрахован.
UPDATE! Вышла новая версия .swf файла, качаем тут, заливаем поверх старого http://swfupload.googlecode.com/files/swfupload.swf.v2.5.0.beta3.2.zip. В новой версии исправлена ошибка с нестабильной работой при ресайзе изображений до расширения больше чем 640х480.