/** * проверяет массив файлов и ресайзит их * * @param array() $fld * @param class $parent */ function putFiles(&$fld, &$parent) { $main_root_id = defined('MAIN_ROOT_ID') ? MAIN_ROOT_ID : 100; $root_id = domainRootId(); $module =& Registry::get('T' . $parent->name); $selector = $module ? (bool) $module->selector : true; foreach ($parent->elem_fields['columns'] as $k => $v) { if (($v['type'] == 'input_image' || $v['type'] == 'input_file') && !empty($fld[$k])) { if (substr($fld[$k], 0, 5) == '@temp') { //перекладываем папку в нужную директорию //определяем директорию использую id и folder для филда или общую $source_file = substr($fld[$k], 5); /*// пока закомментировала создание подпапок root_id, т.к. хотим от них отказаться // позже введем какие-нибудь настройки * if ($main_root_id == $root_id || !$selector) { $folder = FILES_DIR; } else { $folder = FILES_DIR . $root_id . '/'; if (!is_dir($folder)) { mkdir($folder); chmod($folder, DIRS_MOD); } }*/ $folder = FILES_DIR; if (isset($v['display']['folder'])) { $folder .= $v['folder'] . '/'; //Директория для закачивания собственная } elseif ($parent->elem_fields['folder']) { $folder .= $parent->elem_fields['folder'] . '/'; //Директория для закачивания глобальная } verifyDir($folder); $id = get('id', '0', 'p'); $is_fancy = get('is_fancy', '', 'gp'); if ($is_fancy) { $id = get('pid', '0', 'gp'); } //иногда почему-то теряется id :) if (is_array($id)) { $id = $_POST['fld']['id']; } //@todo сделать проверку, что объект создан и id!=0 иначе как-нить раскладывать в другие папкив таких случаях, //можно оставлять где попало и всо второго раза все будет ок..но тоже тупо:) if ($id) { $folder .= $id; } verifyDir($folder); $dest_file = $folder . '/' . basename($source_file); $dest_file = file_getUniName(path($dest_file)); //перемещаем rename($source_file, $dest_file); /* copy($source_file, $dest_file); unlink($source_file); */ $fld[$k] = substr($dest_file, 2); } elseif ($fld[$k] == FILE_NO_SELECT_STR) { $fld[$k] = ""; } } } }
/** * Закачивает файлы в указанную папку * * @param string $dir * @return bool */ function download_files($dir = TEMP_FILE_PATH) { if (isset($_POST['page']) && ($_POST['page'] == 'fm2' || $_POST['page'] == 'fmr')) { return; } // лог файлов global $files_log; //проверяем, нужно ли что-нить закачать if (empty($_FILES)) { $files_log['notice'][] = "There are no files to load..."; return false; } //название темповой папки $temp_dirname = $dir . "/" . $_COOKIE[session_name()]; path($temp_dirname); //создаем коневую папку if (!verifyDir($dir)) { return false; } //создаем временную папку для закачивания == названию сессии if (!verifyDir($temp_dirname)) { return false; } if (!is_file($temp_dirname . '/.htaccess')) { $handle = fopen($temp_dirname . '/.htaccess', 'w'); fwrite($handle, 'Allow from all'); fclose($handle); } $files = array(); //определяем массив файлов для закачивания foreach ($_FILES as $name => $data) { if (is_array($data['name'])) { foreach ($data['name'] as $k => $v) { if (is_array($v)) { foreach ($v as $name2 => $value) { if (!empty($value)) { if (array_key_exists($name2, $_POST[$name][$k])) { $files[] = array('post' => &$_POST[$name][$k][$name2], 'name' => current($value), 'size' => current($data['size'][$k][$name2]), 'type' => current($data['type'][$k][$name2]), 'tmp_name' => current($data['tmp_name'][$k][$name2]), 'error' => current($data['error'][$k][$name2]), 'error_str' => file_uploder_error(current($data['error'][$k][$name2]))); } else { if (count($data['size'][$k]) == 1) { $files[] = array('post' => &$_POST[$name][$k], 'name' => $value, 'size' => current($data['size'][$k]), 'type' => current($data['type'][$k]), 'tmp_name' => current($data['tmp_name'][$k]), 'error' => current($data['error'][$k]), 'error_str' => file_uploder_error(current($data['error'][$k]))); } else { $files[] = array('post' => &$_POST[$name][$k][$name2], 'name' => $value, 'size' => $data['size'][$k][$name2], 'type' => $data['type'][$k][$name2], 'tmp_name' => $data['tmp_name'][$k][$name2], 'error' => $data['error'][$k][$name2], 'error_str' => file_uploder_error($data['error'][$k][$name2])); } } } } } else { $files[] = array('post' => &$_POST[$name][$k], 'name' => $data['name'][$k], 'size' => $data['size'][$k], 'type' => $data['type'][$k], 'tmp_name' => $data['tmp_name'][$k], 'error' => $data['error'][$k], 'error_str' => file_uploder_error($data['error'][$k])); } } } else { if (!empty($data['name'])) { $files[] = array('post' => &$_POST[$name], 'name' => $data['name'], 'size' => $data['size'], 'type' => $data['type'], 'tmp_name' => $data['tmp_name'], 'error' => $data['error'], 'error_str' => file_uploder_error($data['error'])); } } } if (empty($files)) { $files_log['fatal'][] = "There are no files to load..."; return false; } //закачиваем foreach ($files as $k => $v) { if ($v['error'] == 0) { $files[$k]['path'] = file_getUniName($temp_dirname . "/" . GetPureName($v['name'])); //проверяем на совпадение имен файла в кэше if (!move_uploaded_file($v['tmp_name'], $files[$k]['path'])) { unset($files[$k]['path']); $files_log['warning'][] = "Cann't upload the file '" . $v['name'] . "' in function 'move_uploaded_file'"; } else { chmod($files[$k]['path'], FILES_MOD); chown($files[$k]['path'], fileowner($_SERVER['SCRIPT_FILENAME'])); chgrp($files[$k]['path'], filegroup($_SERVER['SCRIPT_FILENAME'])); //возвращаем пути на файлы в указанной папке $files[$k]['post'] = "@temp" . $files[$k]['path']; } } } $_FILES = null; return true; }
/** * Накладывание водяного знака * @param array $fld * @param int $id * @return array|bool */ function ElemRedactAfter($fld, $id) { $id = $id ? $id : (int) $_POST['id']; if (!$id) { return true; } global $watermark_img, $watermark_position; $watermark = (int) get('watermark', 0, 'p'); if (isset($watermark_img) && !empty($watermark_img) && $watermark) { if (!getimagesize($watermark_img)) { return array('error' => "Не найден водяной знак " . $watermark_img); } $row = sql_getRow("SELECT * FROM {$this->elem_table} WHERE id={$id}"); if (!$row) { return array('error' => "Неправильный идентификатор галереи"); } if ($row['image_large']) { $file = '..' . $row['image_large']; $file = urldecode($file); $wmark_info = getimagesize($watermark_img); $file_info = getimagesize($file); if ($wmark_info[0] > $file_info[0]) { return array('error' => "Ширина изображения меньше чем ширина водяного знака"); } if ($wmark_info[1] > $file_info[1]) { return array('error' => "Высота изображения меньше чем высота водяного знака"); } $copy = file_getUniName($file); if (!copy($file, $copy)) { return array('error' => "Ошибка копирования из " . $file . " в " . $copy); } include_once ENGINE_VERSION . '/admin/modules/fm2/watermark.php'; $handle = new RWatermark($file_info[2], $copy); if (!isset($watermark_position)) { $watermark_position = "CM"; } $handle->SetPosition($watermark_position); $handle->SetTransparentColor(255, 0, 255); $handle->SetTransparency(100); switch ($wmark_info[2]) { case '1': $handle->AddWatermark(FILE_GIF, $watermark_img); break; case '2': $handle->AddWatermark(FILE_JPEG, $watermark_img); break; case '3': $handle->AddWatermark(FILE_PNG, $watermark_img); break; } if ($file_info[2] == 1) { imagegif($handle->marked_image, $copy); } elseif ($file_info[2] == 2) { // Определяем примерно, с каким качеством сохранять картинки $size = filesize($copy); if ($size <= '10000') { $quality = '90'; } else { if ($size > '10000' && $size <= '30000') { $quality = '90'; } else { $quality = '85'; } } imagejpeg($handle->marked_image, $copy, $quality); } elseif ($file_info[2] == 3) { imagepng($handle->marked_image, $copy); } $handle->Destroy(); sql_updateId($this->elem_table, array('image_large' => substr($copy, 2)), $id); } } return true; }