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
Форумы портала PHP.SU :: Версия для печати :: Как подключить скрипт загрузки изображений?
Форумы портала PHP.SU » » Вопросы новичков » Как подключить скрипт загрузки изображений?

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

1. Daytona - 19 Января, 2012 - 18:39:17 - перейти к сообщению
Здравствуйте! У меня такая проблема: я пишу один довольно большой скрипт на 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?, возникают еще несколько:


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

  1. Как передавать $_FILES подключаемому скрипту (или наоборот)?
  2. Куда в скрипте вставить эту форму и подключение? И как правильно сделать вызов файла?
  3. Почему когда я жму на кнопку загрузки фото, моя сгенерированная таблица пропадает (и наоборот)? Как это решить?
2. Viper - 20 Января, 2012 - 08:01:39 - перейти к сообщению
Если у вас аплоад организован в виде класса, то подключаете файл и объявляете через new, а дальше используете методы этого класса. Т.е. вам в таком случае не нужно будет ничего передавать в файл.
3. Daytona - 20 Января, 2012 - 08:20:56 - перейти к сообщению
Нет, у меня нет классов нигде
4. Zuldek - 20 Января, 2012 - 09:15:23 - перейти к сообщению
Цитата:
Как передавать $_FILES подключаемому скрипту (или наоборот)?

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

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


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

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


основной файл
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 обратить внимание, чтобы решить эту задачу.

 

Powered by ExBB FM 1.0 RC1