Всем салют! Есть файловый движок microText. Хочу немного усовершенствовать его: прикрутить к созданию/редактированию страниц в админке функцию по загрузке изображения и записи их имени и расширения в переменную: PHP: $path_image = '../i/'; // определяем папку для картинок $types = array('image/gif', 'image/png', 'image/jpeg'); // ограничиваем типы загружаемых файлов $size = 1024000; // ограничиваем размер if (!in_array($_FILES['picture']['type'], $types)) // проверяем тип die('Запрещённый тип файла. <a href="#" onclick="history.back();">Попробовать другой файл?</a>'); if ($_FILES['picture']['size'] > $size) // проверяем размер die('Слишком большой размер файла. <a href="#" onclick="history.back();">Попробовать другой файл?</a>'); $page_content['picture'] = pathinfo($_FILES['picture']['name'], PATHINFO_FILENAME).'.'.pathinfo($_FILES['picture']['name'], PATHINFO_EXTENSION // передаем в переменную имя и расширение загружаемого файла Такая функция работает только при создании новой страницы (нового файла). А при редактировании существующей страницы выдает "запрещенный тип файла". Наверное, потому, что эта функция пытается дописать к существующему значению переменной такое же самое, а img.png.img.png не пропускает (могу ошибаться). По логике, нужно запустить проверку: PHP: if (isset($_POST['picture'])) { // если в переменную значение уже передано (пусть даже и пустое) $page_content['picture'] = trim($_POST['picture']); // оставляем это значение } // если загружаем новый файл, то переписываем значения: if ($_SERVER['REQUEST_METHOD'] == 'POST') { $path_image = '../img/ipage/'; $types = array('image/gif', 'image/png', 'image/jpeg'); $size = 1024000; if (!in_array($_FILES['picture']['type'], $types)) die('Запрещённый тип файла. <a href="#" onclick="history.back();">Попробовать другой файл?</a>'); if ($_FILES['picture']['size'] > $size) die('Слишком большой размер файла. <a href="#" onclick="history.back();">Попробовать другой файл?</a>'); $page_content['picture'] = pathinfo($_FILES['picture']['name'], PATHINFO_FILENAME).'.'.pathinfo($_FILES['picture']['name'], PATHINFO_EXTENSION); } Наверное, ошибка в ($_SERVER['REQUEST_METHOD'] == 'POST'), но как проверить по-другому? А может быть, вообще все неправильно?
И да, кстати, при таком коде, если, создавая новую страницу, не вставить картинку, тоже выдает "запрещенный тип файла". Т.е. типа всегда - и при создании страницы, и каждый раз при ее редактировании нужно заново вставлять картинку, чтобы не выдавало ошибку. Такая вот ерунда получается...
Вопрос: какой, в данном случае, код будет правильным, чтобы не было обязательным каждый раз загружать картинку, т.е. загружена - хорошо, при создании новой страницы записываем значение в переменную, при редактировании старой страницы перезаписываем значение в переменной; не загружена - тоже хорошо, ничего не записываем и не перезаписываем. ? PHP: if загружаем картинку { проверяем тип и размер картинки; if создаем новую страницу { записываем имя и расширение картинки в переменную; } else { имя и расширение старой картинки удаляем, новой картинки - записываем в переменную; } } else { ничего не записываем и не перезаписываем, оставляем значение переменной пустым; }
PHP: $page_content['picture'] = (isset($_POST['picture'])) ? trim($_POST['picture']) : ''; if (!empty($_FILES['picture']) && $_FILES['picture']['error'] == UPLOAD_ERR_OK) { if (is_uploaded_file($_FILES['picture']['tmp_name']) === false) { throw new \Exception('Error on picture: Invalid file definition'); } $path_image = '../img/ipage/'; $page_content['picture'] = pathinfo($_FILES['picture']['name'], PATHINFO_FILENAME).'.'.pathinfo($_FILES['picture']['name'], PATHINFO_EXTENSION); move_uploaded_file($_FILES['picture']['tmp_name'], $path_image . $page_content['picture']); } Но при добавлении после $path_image проверки типа и размера не работает.
PHP: $page_content['picture'] = (isset($_POST['picture'])) ? trim($_POST['picture']) : ''; if (!empty($_FILES['picture']) && $_FILES['picture']['error'] == UPLOAD_ERR_OK) { if (is_uploaded_file($_FILES['picture']['tmp_name']) === false) { throw new \Exception('Error on picture: Invalid file definition'); } $path_image = '../img/ipage/'; $types = array('image/gif', 'image/png', 'image/jpeg'); // Максимальный размер файла $size = 1024000; // Проверяем тип файла if (!in_array($_FILES['picture']['type'], $types)) die('Запрещённый тип файла. <a href="#" onclick="history.back();">Попробовать другой файл?</a>'); // Проверяем размер файла if ($_FILES['picture']['size'] > $size) die('Слишком большой размер файла. <a href="#" onclick="history.back();">Попробовать другой файл?</a>'); $page_content['picture'] = pathinfo($_FILES['picture']['name'], PATHINFO_FILENAME).'.'.pathinfo($_FILES['picture']['name'], PATHINFO_EXTENSION); move_uploaded_file($_FILES['picture']['tmp_name'], $path_image . $page_content['picture']); } Вот так работает при создании страницы: загружает файл, записывает в переменную имя и расширение файла. Но при редактировании страницы, если не менять файл, а зайти на вкладку редактирования и сохранить страницу, значение переменной слетает, не сохраняется.
PHP: if (isset($_POST['picture']) && !empty($_post['picture'])) { $page_content['picture'] = (isset($_POST['picture'])) ? trim($_POST['picture']) : ''; } // Если загружаем изображение elseif (!empty($_FILES['picture']) && $_FILES['picture']['error'] === UPLOAD_ERR_OK) { // Задаем папку для изображений $path_image = '../img/ipage/'; // Массив допустимых значений типа файла $types = array('image/gif', 'image/png', 'image/jpeg'); // Максимальный размер файла $size = 1024000; // Проверяем тип файла if (!in_array($_FILES['picture']['type'], $types)) die('Запрещённый тип файла. <a href="#" onclick="history.back();">Попробовать другой файл?</a>'); // Проверяем размер файла if ($_FILES['picture']['size'] > $size) die('Слишком большой размер файла. <a href="#" onclick="history.back();">Попробовать другой файл?</a>'); // Передаем в переменную имя и расширение файла $page_content['picture'] = pathinfo($_FILES['picture']['name'], PATHINFO_FILENAME).'.'.pathinfo($_FILES['picture']['name'], PATHINFO_EXTENSION); // Перемещаем изображение из временной папки в заданную директорию move_uploaded_file($_FILES['picture']['tmp_name'], $path_image . $_FILES['picture']['name']); } Вот так, казалось, все работает как надо (на новую страницу картинки загружаются, имена присваиваются, на редактируемой странице ничего не слетает, значения остаются). Однако если на новой странице не загрузить фото, то вместо значения или пустоты в переменную записывается ошибка Код (Text): <br /> <b>Notice</b>: Undefined index: picture in <b>D:OpenServerdomainsmicrotextappadmintemplatetemplate_page.inc.php</b> on line <b>9</b><br /> Т.е., судя по всему, требуется объявление переменной в самом начале. Но когда объявляешь эту переменную перед вышеупомянутой функцией Код (Text): $page_content['picture'] = ''; , вылазит другая фигня: при редактировании страницы без повторной или новой загрузки картинки, значение переменной $pictures снова обнуляется.
На другом форуме подсказали, что в первой строке нужно $_post заменить на $_POST. В оригинальном коде $_POST (это в редакторы форумов почему-то скопировалось неправильно), к тому же специально переписал на всяк случай заглавными, но ничего не изменилось, так что проблема не в этом.
Прошу прощения, обновляю тему в надежде на то, что найдется человек, который подскажет, в чем ошибка.
Подсказали на другом форуме, что нужно перед условием задать переменной пустое значение. Итак, правильный код: PHP: // Оставляем пустое значение переменной $page_content['picture'] = ''; // Если значение ранее задано, оставляем его if (isset($_POST['picture']) && !empty($_POST['picture'])) { $page_content['picture'] = (isset($_POST['picture'])) ? trim($_POST['picture']) : ''; } // Если загружаем изображение elseif (!empty($_FILES['picture']) && $_FILES['picture']['error'] === UPLOAD_ERR_OK) { // Задаем папку для изображений $path_image = '../img/ipage/'; // Массив допустимых значений типа файла $types = array('image/gif', 'image/png', 'image/jpeg'); // Максимальный размер файла $size = 1024000; // Проверяем тип файла if (!in_array($_FILES['picture']['type'], $types)) die('Запрещённый тип файла. <a href="#" onclick="history.back();">Попробовать другой файл?</a>'); // Проверяем размер файла if ($_FILES['picture']['size'] > $size) die('Слишком большой размер файла. <a href="#" onclick="history.back();">Попробовать другой файл?</a>'); // Передаем в переменную имя и расширение файла $page_content['picture'] = pathinfo($_FILES['picture']['name'], PATHINFO_FILENAME).'.'.pathinfo($_FILES['picture']['name'], PATHINFO_EXTENSION); // Перемещаем изображение из временной папки в заданную директорию move_uploaded_file($_FILES['picture']['tmp_name'], $path_image . $_FILES['picture']['name']); }