За последние 24 часа нас посетили 22069 программистов и 1115 роботов. Сейчас ищут 698 программистов ...

Загрузка файла на сервер

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

  1. andre2017

    andre2017 Новичок

    С нами с:
    3 авг 2017
    Сообщения:
    67
    Симпатии:
    2
    Здравствуйте, подскажите, правильно ли я делаю. Мне нужно так:

    - пользователь через textarea1 вводит группу чисел, разделяя Ентером и после клика на кнопку они копируются в массив и начинается обработка данных, или же
    - пользователь через окно выбора загружает на сервер локальный файл, числа копируются в textarea1 и в массив и после клика на кнопку начинается обработка.
    - обработка данных происходит в цикле, до конца массива, с выводом результатов в textarea2.

    По отдельности все это работает, но я не могу скомпоновать эти куски вместе, чтобы они работали.
    Я мыслю так:
    - на основной странице есть две textarea (для ввода чисел и для результатов)
    - 1ое событие, для которого нужен обработчик, это нажатие кнопки Upload в окне выбoра файла. Должен запуститься скрипт, копирующий файл построчно в textarea и в массив.
    - 2ое событие, это нажатие кнопки Старт, запускающей скрипт. обрабатывающий массив до конца.
    - 3е событие, это окончание обработки очередного числа и обновление лога в textarea2 (дописывание строк).
    Я так понимаю, что на одной странице это лучше не делать, но когда я разношу скрипты и формы по отдельным файлам, то они либо не видят друг-друга, либо не обновляют textarea.

    file_upload.php
    PHP:
    1. <?php
    2. $uploadfile = $uploaddir . basename($_FILES['userfile']['name']);
    3. //  - файл у меня загружается успешно во временную папку на сервере!
    4. if (is_uploaded_file($_FILES['userfile']['tmp_name'])) {
    5.    echo "Файл ". $_FILES['userfile']['name'] ." успешно загружен.\n";
    6.    $INNs = readfile($_FILES['userfile']['tmp_name']);
    7. } else {
    8.    echo "Ошибка загрузки";
    9. }
    10.   // echo $INNs.'<br>'; // И данные выводятся правильно из файла.
    11.  
    12. $_SESSION['INNs'] = $INNs;
    13.    echo '<script>window.location.href = "forms.html";</script>'; // возврат на основную страницу
    14. ?>
    Обработчик данных (пока просто копирование)
    PHP:
    1. <?php
    2.  
    3. $INNs  = $_SESSION["INNs"];// НЕ ПОНИМАЮ, но здесь теперь хранится размер файла, а не данные!!!
    4. echo $INNs;
    5.  
    6. //---------- обработчик нажатия кнопки Старт ----
    7. if (isset($_POST['INN_list'])) {
    8.  
    9.    // Заполнение массива числами построчно из textarea1
    10.    $INN_arr = explode("\n", $_POST[INN_list]); // Копируем Textarea1 в массив
    11.  
    12.    // Обработка данных построчно
    13.    foreach($INN_arr as $val){
    14.     //-- Обработка данных
    15.      $result .= "$val\n"; // Добавляем результат в Textarea2
    16.    }
    17. }
    18. // А как результат посылать периодически в окно Textarea2 ?
    19.    echo '<script>window.location.href = "forms.html";</script>'; // возврат на основную страницу
    20. ?>
    Основная страница:
    HTML:
    1. <?php
    2. session_start();
    3. $result = $_SESSION['result'] ;
    4. ?>
    5.  
    6.  
    7. <!-- FILE -->
    8. <form enctype="multipart/form-data" action="file_upload.php" method="POST">
    9.   <!-- Название элемента input определяет имя в массиве $_FILES -->
    10.   <input name="userfile" type="file" />
    11.   <input type="submit" value="Upload" />
    12. </form>
    13.  
    14. <!-- TEXTAREA1 -- DATA -->
    15. <form action="obrab.php" method="post" name="forma_spisok" onsubmit="return forma_spisok">
    16. <textarea name="INN_list" cols="10" rows="25">
    17. <?
    18.  echo $result; // ничего не выводит :-(
    19. ?>
    20. <input type="submit" value="START"/>
    21. </form>
    22.  
    23.  
    24. <!-- TEXTAREA2 - LOG -->
    25. <textarea name="LOG" cols="120" rows="30">
    26. <?
    27.  echo $result; // ничего не выводит :-(
    28. ?>
    29.  
    30.  
    31. </body>
    32. </html>
    33.  
     
    #1 andre2017, 17 авг 2017
    Последнее редактирование: 17 авг 2017
  2. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    Вообще, данная задача может быть реализована и без сервера, чисто на JS.

    Не принципиально.
    Кавычки забываешь. Нотисы лететь должны по-хорошему.

    А где эта переменная объявляется? Я про $result. Тоже нотисы должны быть.

    Под ваш случай, вообще, подошел бы AJAX хорошо. Гораздо проще было бы, чем геморроиться с перезагрузкой страницы, которая должна себя между перезагрузками еще и вести по-разному.
     
    andre2017 и Deonis нравится это.
  3. RyF

    RyF Новичок

    С нами с:
    13 июл 2017
    Сообщения:
    12
    Симпатии:
    4
    Вообще простейший вариант выглядит примерно так
    PHP:
    1. <?php
    2.  
    3. $error = false;
    4. if($_POST['send_file']){
    5.     $file = $_FILES['file'];
    6.     if($file['name'] == ''){
    7.             $error = "Выберите файл";
    8.             return;
    9.         }
    10.         $size = 2000000;
    11.         $types = array('image/jpeg','image/png','image/gif');
    12.         $src = 'img/';
    13.         if($file['size'] > $size){
    14.             $error = 'Слишком большой файл';
    15.             return;
    16.         }
    17.         if(!in_array($file['type'], $types)){
    18.             $error = 'Недопустимое расширение файла';
    19.             return;
    20.         }
    21.  
    22.         if(copy($file['tmp_name'],$src.$file['name'])){
    23.             echo "Файл успешно загружен";
    24.         }else{
    25.             $error = 'Ошибка загрузки файла';
    26.         }
    27. }
    28.  
    29. ?>
    30. <!DOCTYPE html>
    31. <html lang="en">
    32. <head>
    33.     <meta charset="UTF-8">
    34.     <title>Document</title>
    35. </head>
    36. <body>
    37.     <?php if($error){
    38.         echo "Ошибка загрузки файла";
    39.         }?>
    40.     <form method="post" enctype="multipart/form-data">
    41.         <input type="file" name="file" placeholder="Выберите файл">
    42.         <input type="submit" value="Загрузить файл" name="send_file">
    43.     </form>
    44. </body>
    45. </html>
    В идеале можно сделать через ajax
     
    andre2017 нравится это.
  4. andre2017

    andre2017 Новичок

    С нами с:
    3 авг 2017
    Сообщения:
    67
    Симпатии:
    2
    cпасибо, почти все заработало!!!
    --- Добавлено ---
    А как сделать, чтобы в текстареа2 писало (обновлялось) не после всего цикла, а после обработки каждой строки?
    HTML:
    1. <?php
    2. session_start();
    3. $INNs = $_SESSION['INNs']; unset($_SESSION['INNs']);
    4. $result = $_SESSION['result']; unset($_SESSION['result']);
    5.  
    6. function Obrab($val){
    7.     $val += 1;// тестовая обработка
    8.     sleep(1);// имитация долгой обработки
    9.     return $val;
    10. }
    11.  
    12. // Обработчик нажатия кнопки START
    13. if (isset($_POST['INN_list'])) {
    14.   $INN_arr = explode("\n", $_POST['INN_list']);  // Копируем Textarea1 в массив
    15.  
    16.   // основной цикл обработки массива данных построчно
    17.   foreach($INN_arr as $val){
    18.    $result .= Obrab($val); // Добавляем результат в Textarea2. Это работает, но только когда цикл закончится и вернется на страницу
    19. //    echo "<script>document.getElementById('my').value+= $result; </script>";//  вообще не пишет  
    20.     }
    21. }
    22. ?>
    23.  
    24.  
    25.  
    26.  
    27. <!-- FILE -->
    28. <form enctype="multipart/form-data" action="file_upload.php" method="POST">
    29.     <!-- Название элемента input определяет имя в массиве $_FILES -->
    30.     <input name="userfile" type="file" />
    31.        <input type="submit" value="Загрузить файл" name="send_file">
    32. </form>
    33.  
    34. <!-- TEXTAREA1 -- DATA -->
    35. <form action="" method="post" name="forma_spisok" onsubmit="return forma_spisok">
    36. <textarea name="INN_list" cols="10" rows="10">
    37. <?php
    38.    if ($INNs!='') foreach($INNs as $val) echo $val; // Копирование массива в textarea
    39. ?>
    40. <input type="submit" value="START"/>
    41. </form>
    42.  
    43. <!-- TEXTAREA2 -- LOG -->
    44. <textarea id="my"  cols="100" rows="10">
    45. <?
    46.  echo $result;
    47. ?>
    48.  
    49. <script>document.getElementById('my').value+=' А отсюда пишет в текстареа'; </script>
    50.  
    51. </body>
    52. </html>
     
  5. andre2017

    andre2017 Новичок

    С нами с:
    3 авг 2017
    Сообщения:
    67
    Симпатии:
    2
    Не в тему вопрос! буду разбираться с COMET, Всем спасибо. Вопрос закрыт.