Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Как подключить скрипт загрузки изображений?

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: include/require не передают подключаемому файлу массив $_FILES
Daytona
Отправлено: 19 Января, 2012 - 18:39:17
Post Id


Новичок


Покинул форум
Сообщений всего: 5
Дата рег-ции: Янв. 2012  


Помог: 0 раз(а)




Здравствуйте! У меня такая проблема: я пишу один довольно большой скрипт на PHP, и тут дошла очередь до загрузки изображений. Её я решил написать в отдельном файле, чтобы потом подключить к первому, большому. Да и от большого не мешало бы отделить функции в отдельные файлы.

Оба скрипта по отдельности работают. Загрузчик изображений перехватывает как ошибки $_FILES['uploadfile']['error'], is_upload_file(), так и проверяет размеры картинки и т.д. И выдает на экран оригинал + 2 картинки меньших размеров.

Большой скрипт представляет собой обработчик форм: строит таблицу типа Параметр - Значение, в некоторых случаях лазя в БД, для проверки "а нет ли уже таких введенных значений". Ну, да это не важно. Таблица выводится с помощью PHP, срабатывая на нажатие кнопки.

Вот общая структура файлов:
img_upload.php
PHP:
скопировать код в буфер обмена
  1. <form  method="post" action="img_upload.php" enctype="multipart/form-data">
  2.     <input type="file" name="uploadfile">
  3.     <input type="submit" name="upload" value="Upload image">
  4. </form>
  5. <?PHP
  6. /f (isset($_POST['upload'])) // При нажатии кнопки идет загрузка и т.п.
  7. {
  8.            $file_old_name = $_FILES['uploadfile']['name']; // Имя загружаемого файла
  9.            // Ну и далее в том же духе: переменные, функции, проверки...
  10.            // если все проверки пройдены успешно и все отработало, то выведется
  11.             echo "<img src=\"/img/".basename($v)."\">\n";
  12.             // т.е. html-ная картинка. Ну и впоследствии сделаю, чтобы в главный файл некоторые переменные передавались
  13. }
  14. ?>


form.php
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. if (isset($_POST['preview'])) // При нажатии на Превью генерируется таблица, предварительно проверяется корректность введенных данных
  4. {
  5.        // И опять проверки, функции....
  6.       // Пошла сгенерированная таблица:
  7.        ?>
  8.     <table border="1" bordercolor="lightgrey" align="center" width="60%">
  9.         <tr align="left">
  10.             <td>
  11.              .....
  12.             // В конце таблицы выводится кнопочка, при нажатии которой все данные уплывут в БД
  13.             <form name="commit" id="add" method="post" action="commit.php">
  14.                     <br><input type="submit" name="add" form="add" value="Add">
  15.                 </form>
  16.             </td>
  17.         </tr>
  18.     </table>
  19. Далее идет та таблица, которая выводится в любом случае - в ней выводятся формы для заполнения
  20.  
  21. <form method="POST">
  22. <fieldset>
  23.     <legend><h4>General info</h4></legend>
  24.     <table cellspacing="0" cellpadding="5" border="0" bordercolor="lightgrey" width="100%">
  25.      ......
  26.      </table>
  27.     </fieldset>    
  28.     <p><input type="submit" name="preview" value="Preview">
  29. </form>
  30. </body>
  31. </html>
  32.  


Кроме главного вопроса - почему не работает include/require?, возникают еще несколько:
  • Я поместил <input>ы в конец таблицы и связал их по id с формой, попутно перенеся форму загрузки из скрипта загрузки в общий файл, а там её закомментирвал:
    PHP:
    скопировать код в буфер обмена
    1.  
    2.  <td>
    3.                
    4.                     <input type="file" name="uploadfile" form="img_upload">
    5.                     <input type="submit" name="upload" value="Upload image" form="img_upload">
    6.                
    7.                 <?PHP
    8.                     if (isset($_POST['upload']))
    9.                     {
    10.                         echo "<br>".$_FILES['upload'];
    11.                         $upl = $_FILES['uploadfile'];
    12.                         include("img_upload.php");
    13.                     }
    14.                 ?>
    15.             </td>
    16.         </tr>
    17.     </table>
    18.     </fieldset>
    19.     <p><input type="submit" name="preview" value="Preview">
    20. </form>
    21. <form  method="post" id="img_upload" enctype="multipart/form-data">
    22.  


    В это случае данная проверка почему-то работает и выводит мне мое сообщение о том, что выбранный файл не является изображением (потому что его ширина пустая), хотя я еще ничего не нажимал. Т.е. при загрузке страницы почему-то в любом случае отрабатывается условие и скрипт выполняется, хотя, если посмотреть выше и увидеть такое же условие в двух вышеприведенных файлах, то там без нажатия ничего не делалось. Попытки все-таки выбрать картинку и загрузить её ничего не меняют. Обычные переменные подключенный файл видит, а массив $_FILES, который надо передать - нет, разве что он передан через $var1 = $_FILES['uploadfile']['tmp_name'], $var2 = $_FILES['uploadfile']['name'] и т.д. Это же неудобно! Я конечно, могу создать цикл, переливающий из этого массива в мой, а потом свой передать, но разве это единственный способ? Просто $var = $_FILES['uploadfile'] не работает. Можно как-то решить передачу этого суперглобального массива? Если запрашивать его в подключаемом скрипте, то он снова будет пустым, независимо от того, в каком скрипте находилвась форма.

  1. Как передавать $_FILES подключаемому скрипту (или наоборот)?
  2. Куда в скрипте вставить эту форму и подключение? И как правильно сделать вызов файла?
  3. Почему когда я жму на кнопку загрузки фото, моя сгенерированная таблица пропадает (и наоборот)? Как это решить?
 
 Top
Viper
Отправлено: 20 Января, 2012 - 08:01:39
Post Id



Активный участник


Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007  
Откуда: Симферополь


Помог: 98 раз(а)




Если у вас аплоад организован в виде класса, то подключаете файл и объявляете через new, а дальше используете методы этого класса. Т.е. вам в таком случае не нужно будет ничего передавать в файл.


-----
Список фильмов с описанием, блекджеком и... для Joomla? -> https://киноархив[dot]com
Демо нового движка для сайта php.su -> php[dot]su, проект на гитхабе
 
 Top
Daytona
Отправлено: 20 Января, 2012 - 08:20:56
Post Id


Новичок


Покинул форум
Сообщений всего: 5
Дата рег-ции: Янв. 2012  


Помог: 0 раз(а)




Нет, у меня нет классов нигде
 
 Top
Zuldek
Отправлено: 20 Января, 2012 - 09:15:23
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2122
Дата рег-ции: Июнь 2010  


Помог: 50 раз(а)




Цитата:
Как передавать $_FILES подключаемому скрипту (или наоборот)?

$_FILES передавать не нужно это супер-глобальный массив работайте с ним напрямую с любого скрипта.
Цитата:
Куда в скрипте вставить эту форму и подключение? И как правильно сделать вызов файла?

если не используются классы и внутренние вызовы, то я стараюсь выносить все включения внешних скриптов в начало через include или require_once
Почему когда я жму на кнопку загрузки фото, моя сгенерированная таблица пропадает (и наоборот)? Как это решить?
вообще решать надо начинать с просмотра лога ошибок сервера, если вывод ошибок запрещен. Ещё поставьте проверки после каждого действия скрипта если не пользуетесь отладчиком. например тривиально:
CODE (htmlphp):
скопировать код в буфер обмена
  1. if(copy()) {
  2. echo "прошло копирования";
  3. }
  4. else {
  5. echo "спотыкнулись на copy";
  6. }
 
 Top
Daytona
Отправлено: 20 Января, 2012 - 11:35:46
Post Id


Новичок


Покинул форум
Сообщений всего: 5
Дата рег-ции: Янв. 2012  


Помог: 0 раз(а)




Zuldek пишет:
$_FILES передавать не нужно это супер-глобальный массив работайте с ним напрямую с любого скрипта.


В том-то и дело, что в подключаемом скрипте этот массив пустой. Решил эту проблему в главном файле так:
PHP:
скопировать код в буфер обмена
  1. if (isset($_POST['upload']))
  2.                     {
  3.                         foreach ($_FILES['uploadfile'] as $k => $v)
  4.                         {
  5.                             $files[$k] = $v;
  6.                             //echo "<br>".$files[$k];
  7.                         }
  8.                         include("img_upload.php");
  9.                     }


Теперь там все работает от созданного массива.

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


Я вывод ошибок включил в начале файла. Иногда и вывод варнингов и нотисов включаю, если они не сильно мешают. Во всех критических местах у меня такие проверки стоят. Просто основной код - это различные расчеты и преобразования, поэтому, когда какая-нибудь переменная пустая, я вижу нотис или варнинг. В подключенном скрипте я видел варнинг о том, что ф-я getimagesize() не сработала из-за пустой переменной, к-й как раз был суперглобальный массив $_FILES


Попытался максимально обобщить схему работы главного скрипта и вот, что вышло:

PHP:
скопировать код в буфер обмена
  1. Общие функции
  2. Общие переменные
  3. if ...    // Вывод сгенерированной таблицы
  4.        {
  5.              Вызов общих функций
  6.              Расчеты 1
  7.               Результаты расчетов 1
  8.         }
  9.  
  10. if ... // Подключение файла загрузки картинок
  11.        {
  12.               Подключение файла
  13.               Вызов локальных функций файла
  14.               Расчеты 2 в подключенном файле
  15.               Результаты расчетов 2
  16.         }


После этого понял, что все функции лучше делать общими и держать отдельно от самого файла (так он меньше строчек занимает, когда их около тысячи, крутить мышкой вверх-вниз не очень удобно). А вот как сделать так, чтобы результаты расчетов были тоже доступны "глобально"? Получается так, что у меня либо одна часть скрипта работает, либо другая и результаты одной части недоступны для другой
 
 Top
Daytona
Отправлено: 20 Января, 2012 - 14:34:21
Post Id


Новичок


Покинул форум
Сообщений всего: 5
Дата рег-ции: Янв. 2012  


Помог: 0 раз(а)




Кое-что поменял, теперь структура выглядит так:

файл с функциями


основной файл
PHP:
скопировать код в буфер обмена
  1. Общие переменные
  2. Подключение файла с функциями
  3. if .... // загрузка изображения
  4.     {
  5.          Подключение файла
  6.          Использование общих функций из файла с функциями
  7.          Результат 1
  8.     }
  9. if ... // генерирование таблицы
  10.    {
  11.        Использование общих функций из файла с функциями
  12.        Помещение загруженного изображения в ячейку таблицы
  13.        Результат 2
  14.     }
  15.  


Казалось бы, такой код должен работать так, как задумано. Однако решились только 2 второстепенные проблемы:
1) теперь опять нормально работает суперглобальный массив $_FILES и нет нужды использовать массивы-посредники
2) разбитие файлов на несколько мелких положительно сказалось на мобильности и удобстве работы

2 другие важные проблемы не решены:
1) работает только половина кода - в зависимости от нажатой кнопки. "Гениальный" перенос загрузки изображения в начало кода (действительно, чтобы таблица смогла отобразить изображение, он вначале должен быть загружен) ничего не дал - переменная, хранящая имя картинки, создается только при загрузке изображения.
2) Возможности последовательной загрузки нескольких изображений нет (её конечно можно реализовать, используя несколько форм загрузки, но мне надо, чтобы изображений загружалось столько, сколько нужно, и последовательно, а не все сразу) - при загрузке нового изображения оно как бы вытесняет старое (а точнее, заменяется новым значением). Ухищрения вида
PHP:
скопировать код в буфер обмена
  1.  $img_counter = 0;
  2. if (isset($_POST['upload']))
  3. {
  4.     $img_counter++;
  5. for ($i = 0; $i < $img_counter; $i++)
  6.         {
  7.                  //echo $img_arr_s[$i];
  8.                 echo "\n\t\t<img src=\"img/".$img_arr_s[$i]."\">";
  9.          }

ни к чему не приводят - счетчик все время стоит на единице.

Тут-то я вспомнил про http://phpfaq[dot]ru/na_tanke Радость и понял, что эти проблемы перетекают уже в другую плоскость. Подскажите, пожалуйста, на какие конкретно моменты (главы, статьи) в javascript обратить внимание, чтобы решить эту задачу.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB