За последние 24 часа нас посетили 87292 программиста и 4639 роботов. Сейчас ищут 2040 программистов ...

Изображения в админке на файловом движке

Тема в разделе "PHP для новичков", создана пользователем yurashuka, 2 авг 2018.

  1. yurashuka

    yurashuka Новичок

    С нами с:
    2 авг 2018
    Сообщения:
    10
    Симпатии:
    0
    Всем салют!
    Есть файловый движок microText. Хочу немного усовершенствовать его: прикрутить к созданию/редактированию страниц в админке функцию по загрузке изображения и записи их имени и расширения в переменную:
    PHP:
    1. $path_image = '../i/'; // определяем папку для картинок
    2. $types = array('image/gif', 'image/png', 'image/jpeg'); // ограничиваем типы загружаемых файлов
    3. $size = 1024000; // ограничиваем размер
    4. if (!in_array($_FILES['picture']['type'], $types)) //  проверяем тип
    5. die('Запрещённый тип файла. <a href="#" onclick="history.back();">Попробовать другой файл?</a>');
    6. if ($_FILES['picture']['size'] > $size) // проверяем размер
    7. die('Слишком большой размер файла. <a href="#" onclick="history.back();">Попробовать другой файл?</a>');
    8. $page_content['picture'] = pathinfo($_FILES['picture']['name'], PATHINFO_FILENAME).'.'.pathinfo($_FILES['picture']['name'], PATHINFO_EXTENSION // передаем в переменную имя и расширение загружаемого файла
    Такая функция работает только при создании новой страницы (нового файла). А при редактировании существующей страницы выдает "запрещенный тип файла". Наверное, потому, что эта функция пытается дописать к существующему значению переменной такое же самое, а img.png.img.png не пропускает (могу ошибаться). По логике, нужно запустить проверку:
    PHP:
    1. if (isset($_POST['picture'])) { // если в переменную значение уже передано (пусть даже и пустое)
    2.     $page_content['picture'] = trim($_POST['picture']); // оставляем это значение
    3. }
    4. // если загружаем новый файл, то переписываем значения:
    5. if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    6.     $path_image = '../img/ipage/';
    7.     $types = array('image/gif', 'image/png', 'image/jpeg');
    8.     $size = 1024000;
    9.     if (!in_array($_FILES['picture']['type'], $types))
    10.     die('Запрещённый тип файла. <a href="#" onclick="history.back();">Попробовать другой файл?</a>');
    11.     if ($_FILES['picture']['size'] > $size)
    12.     die('Слишком большой размер файла. <a href="#" onclick="history.back();">Попробовать другой файл?</a>');
    13.     $page_content['picture'] = pathinfo($_FILES['picture']['name'], PATHINFO_FILENAME).'.'.pathinfo($_FILES['picture']['name'], PATHINFO_EXTENSION);  
    14. }
    Наверное, ошибка в ($_SERVER['REQUEST_METHOD'] == 'POST'), но как проверить по-другому? А может быть, вообще все неправильно?
     
  2. yurashuka

    yurashuka Новичок

    С нами с:
    2 авг 2018
    Сообщения:
    10
    Симпатии:
    0
    И да, кстати, при таком коде, если, создавая новую страницу, не вставить картинку, тоже выдает "запрещенный тип файла". Т.е. типа всегда - и при создании страницы, и каждый раз при ее редактировании нужно заново вставлять картинку, чтобы не выдавало ошибку. Такая вот ерунда получается...
     
  3. yurashuka

    yurashuka Новичок

    С нами с:
    2 авг 2018
    Сообщения:
    10
    Симпатии:
    0
    Вопрос:

    какой, в данном случае, код будет правильным, чтобы не было обязательным каждый раз загружать картинку, т.е.

    загружена - хорошо,
    при создании новой страницы записываем значение в переменную,
    при редактировании старой страницы перезаписываем значение в переменной;

    не загружена - тоже хорошо,
    ничего не записываем и не перезаписываем.

    ?

    PHP:
    1. if загружаем картинку {
    2.      проверяем тип и размер картинки;
    3.      if создаем новую страницу {
    4.           записываем имя и расширение картинки в переменную;
    5.      }
    6.      else {
    7.           имя и расширение старой картинки удаляем, новой картинки - записываем в переменную;
    8.      }
    9. }
    10. else {
    11.      ничего не записываем и не перезаписываем, оставляем значение переменной пустым;
    12. }
     
  4. yurashuka

    yurashuka Новичок

    С нами с:
    2 авг 2018
    Сообщения:
    10
    Симпатии:
    0
    PHP:
    1. $page_content['picture'] = (isset($_POST['picture'])) ? trim($_POST['picture']) : '';
    2.  
    3. if (!empty($_FILES['picture']) && $_FILES['picture']['error'] == UPLOAD_ERR_OK) {
    4.     if (is_uploaded_file($_FILES['picture']['tmp_name']) === false) {
    5.         throw new \Exception('Error on picture: Invalid file definition');
    6.     }
    7.     $path_image = '../img/ipage/';
    8.     $page_content['picture'] = pathinfo($_FILES['picture']['name'], PATHINFO_FILENAME).'.'.pathinfo($_FILES['picture']['name'], PATHINFO_EXTENSION);
    9.     move_uploaded_file($_FILES['picture']['tmp_name'], $path_image . $page_content['picture']);
    10. }
    Но при добавлении после $path_image проверки типа и размера не работает.
     
  5. yurashuka

    yurashuka Новичок

    С нами с:
    2 авг 2018
    Сообщения:
    10
    Симпатии:
    0
    PHP:
    1. $page_content['picture'] = (isset($_POST['picture'])) ? trim($_POST['picture']) : '';
    2. if (!empty($_FILES['picture']) && $_FILES['picture']['error'] == UPLOAD_ERR_OK) {
    3.     if (is_uploaded_file($_FILES['picture']['tmp_name']) === false) {
    4.         throw new \Exception('Error on picture: Invalid file definition');
    5.     }
    6.     $path_image = '../img/ipage/';
    7.     $types = array('image/gif', 'image/png', 'image/jpeg');
    8.     // Максимальный размер файла
    9.     $size = 1024000;
    10.     // Проверяем тип файла
    11.     if (!in_array($_FILES['picture']['type'], $types))
    12.         die('Запрещённый тип файла. <a href="#" onclick="history.back();">Попробовать другой файл?</a>');
    13.     // Проверяем размер файла
    14.     if ($_FILES['picture']['size'] > $size)
    15.         die('Слишком большой размер файла. <a href="#" onclick="history.back();">Попробовать другой файл?</a>');
    16.     $page_content['picture'] = pathinfo($_FILES['picture']['name'], PATHINFO_FILENAME).'.'.pathinfo($_FILES['picture']['name'], PATHINFO_EXTENSION);
    17.     move_uploaded_file($_FILES['picture']['tmp_name'], $path_image . $page_content['picture']);
    18. }
    Вот так работает при создании страницы: загружает файл, записывает в переменную имя и расширение файла. Но при редактировании страницы, если не менять файл, а зайти на вкладку редактирования и сохранить страницу, значение переменной слетает, не сохраняется.
     
  6. yurashuka

    yurashuka Новичок

    С нами с:
    2 авг 2018
    Сообщения:
    10
    Симпатии:
    0
    PHP:
    1. if (isset($_POST['picture']) && !empty($_post['picture'])) {
    2.     $page_content['picture'] = (isset($_POST['picture'])) ? trim($_POST['picture']) : '';
    3. }
    4. // Если загружаем изображение
    5. elseif (!empty($_FILES['picture']) && $_FILES['picture']['error'] === UPLOAD_ERR_OK) {
    6.     // Задаем папку для изображений
    7.     $path_image = '../img/ipage/';
    8.     // Массив допустимых значений типа файла
    9.     $types = array('image/gif', 'image/png', 'image/jpeg');
    10.     // Максимальный размер файла
    11.     $size = 1024000;
    12.     // Проверяем тип файла
    13.     if (!in_array($_FILES['picture']['type'], $types))
    14.         die('Запрещённый тип файла. <a href="#" onclick="history.back();">Попробовать другой файл?</a>');
    15.     // Проверяем размер файла
    16.     if ($_FILES['picture']['size'] > $size)
    17.         die('Слишком большой размер файла. <a href="#" onclick="history.back();">Попробовать другой файл?</a>');
    18.     // Передаем в переменную имя и расширение файла
    19.     $page_content['picture'] = pathinfo($_FILES['picture']['name'], PATHINFO_FILENAME).'.'.pathinfo($_FILES['picture']['name'], PATHINFO_EXTENSION);    
    20.     // Перемещаем изображение из временной папки в заданную директорию
    21.     move_uploaded_file($_FILES['picture']['tmp_name'], $path_image . $_FILES['picture']['name']);
    22. }
    Вот так, казалось, все работает как надо (на новую страницу картинки загружаются, имена присваиваются, на редактируемой странице ничего не слетает, значения остаются). Однако если на новой странице не загрузить фото, то вместо значения или пустоты в переменную записывается ошибка
    Код (Text):
    1. <br />
    2. <b>Notice</b>:  Undefined index: picture in <b>D:OpenServerdomainsmicrotextappadmintemplatetemplate_page.inc.php</b> on line <b>9</b><br />
    Т.е., судя по всему, требуется объявление переменной в самом начале.
    Но когда объявляешь эту переменную перед вышеупомянутой функцией
    Код (Text):
    1. $page_content['picture'] = '';
    , вылазит другая фигня: при редактировании страницы без повторной или новой загрузки картинки, значение переменной $pictures снова обнуляется.
     
  7. yurashuka

    yurashuka Новичок

    С нами с:
    2 авг 2018
    Сообщения:
    10
    Симпатии:
    0
    На другом форуме подсказали, что в первой строке нужно $_post заменить на $_POST. В оригинальном коде $_POST (это в редакторы форумов почему-то скопировалось неправильно), к тому же специально переписал на всяк случай заглавными, но ничего не изменилось, так что проблема не в этом.
     
  8. yurashuka

    yurashuka Новичок

    С нами с:
    2 авг 2018
    Сообщения:
    10
    Симпатии:
    0
    Вопрос не решен, к сожалению. Мне казалось, что вопрос сложный только для таких гуманитариев, как я.
     
  9. yurashuka

    yurashuka Новичок

    С нами с:
    2 авг 2018
    Сообщения:
    10
    Симпатии:
    0
    Прошу прощения, обновляю тему в надежде на то, что найдется человек, который подскажет, в чем ошибка.
     
  10. yurashuka

    yurashuka Новичок

    С нами с:
    2 авг 2018
    Сообщения:
    10
    Симпатии:
    0
    Подсказали на другом форуме, что нужно перед условием задать переменной пустое значение.
    Итак, правильный код:
    PHP:
    1. // Оставляем пустое значение переменной
    2. $page_content['picture'] = '';
    3. // Если значение ранее задано, оставляем его
    4. if (isset($_POST['picture']) && !empty($_POST['picture'])) {
    5.     $page_content['picture'] = (isset($_POST['picture'])) ? trim($_POST['picture']) : '';
    6. }
    7. // Если загружаем изображение
    8. elseif (!empty($_FILES['picture']) && $_FILES['picture']['error'] === UPLOAD_ERR_OK) {
    9.     // Задаем папку для изображений
    10.     $path_image = '../img/ipage/';
    11.     // Массив допустимых значений типа файла
    12.     $types = array('image/gif', 'image/png', 'image/jpeg');
    13.     // Максимальный размер файла
    14.     $size = 1024000;
    15.     // Проверяем тип файла
    16.     if (!in_array($_FILES['picture']['type'], $types))
    17.         die('Запрещённый тип файла. <a href="#" onclick="history.back();">Попробовать другой файл?</a>');
    18.     // Проверяем размер файла
    19.     if ($_FILES['picture']['size'] > $size)
    20.         die('Слишком большой размер файла. <a href="#" onclick="history.back();">Попробовать другой файл?</a>');
    21.     // Передаем в переменную имя и расширение файла
    22.     $page_content['picture'] = pathinfo($_FILES['picture']['name'], PATHINFO_FILENAME).'.'.pathinfo($_FILES['picture']['name'], PATHINFO_EXTENSION);    
    23.     // Перемещаем изображение из временной папки в заданную директорию
    24.     move_uploaded_file($_FILES['picture']['tmp_name'], $path_image . $_FILES['picture']['name']);
    25. }