Dating Pro и загрузка файлов на сервер
8 Сентябрь 2011
Шалом! Довелось мне тут давеча поработать с движком Dating Pro – если кто не знает, такая большая тяжелая шестеренка для организации сайта знакомств. Не смотря на свои размеры (дистрибутив более 100мб) – работает весьма шустро и не сравнится с джумлой в связке с кривыми модулями от испанских разработчиков-индусов (был опыт, ага). Так вот, проблема была в том, что при попытке обновить аватарочку вываливалось сообщение об ошибке – попросили исправить.
Начал разбираться. В админке нашлась галочка «Модерировать загружаемые изображения», однако там было все в порядке. С «владельцем» и правами доступа/записи на временную директорию и на директорию назначения самого движка все тоже было в норме. Полез копаться в коде. Выяснилось вот что: загрузка файла происходила нормально, после чего движок пытался изменить размер загруженного изображения ДО его переноса из временной папки темп (общей для всего сервера), т.е. открыть картинку, изменить ее размер и записать обратно. После этого видимо все и ломалось. Показалось мне, не по феншую это, и проблема могла исходить именно отсюда. Для этого сразу после кода загрузки файла, перед всеми остальными действиями движка, я вставил вот такой код:
# --- Перемещаем загруженый файл во временную папку --- # $new_file_name = $this->GetNewFileName($upload["name"], $id_user); $upload_path = $_SERVER['DOCUMENT_ROOT']."/images_tmp/".$new_file_name; $moved = move_uploaded_file($upload["tmp_name"], $upload_path); $upload["tmp_name"] = $upload_path; # ----------------------------------------------------- #
Что здесь происходит? В первой строке генерируем имя нового файла, используя стандартную функцию движка – здесь ничего особенного. В массиве $upload хранятся данные по загруженному файлу. Далее собираем полный путь до временной директории в каталоге самого движка чтобы засунуть туда нашу картинку – после всех действий мы ее отсюда удалим. В третьей строке, с помощью стандартной пхп-шной функции переносим загруженный файл из общей папки серевера (например, /var/tmp) в нашу временную директорию. И последней строкой меняем в массиве полный путь с именем загруженного файла на новый, только что созданный. Делается это потому, что далее движок для всех своих действий (ресайза, создания картинок для предпросмотра, большой и маленькой аватарок) использует именно этот массив, и получается что теперь все действия производятся над файлом в локальной директории сайта, где он имеет полные права и может хозяйничать там как хочет. В теории, и во временной папке он имеет достаточные права – но вот как-то так.
После проделанных действий все заработало как надо. Осталось только после всех телодвижений движка удалить файл из временной директории:
# --- удаляем картинку из временной папки --- # unlink($upload["tmp_name"]); # ------------------------------------------- #
Готово, теперь картинки загружаются как надо, и временная директория не захламляется ненужными временными изображениями. Все просто
Учитесь разбираться в чужом коде – пригодится

