За последние 24 часа нас посетили 69409 программистов и 10307 роботов. Сейчас ищут 2895 программистов ...

Причины возвращения функцией параметра False move_uploaded_file

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

  1. Webster31

    Webster31 Новичок

    С нами с:
    16 авг 2016
    Сообщения:
    43
    Симпатии:
    0
    Всем привет ! Возник очень интересный вопрос над которым я ломаю голову уже 2 дня есть функция которая заливает на сервер файлы :
    Код (Text):
    1. if(isset($_POST['file_umploads'])){
    2.  
    3.     function file_umploads($file_gggh){
    4.     global $filezipe;    //Разрешаю загрузку
    5.    
    6.     $json_fi = json_decode(base64_decode(rawurldecode($file_gggh)));      
    7.     $file_name = $json_fi->file_name;       // Имя файла
    8.     $file_tmp = $json_fi->file_tmp;         // Временное хранилище
    9.     $file_size = $json_fi->size;            // Размер файла
    10.     $uploaddir = "file/";                       // директория
    11.                
    12.     if($filezipe == 1){  //1
    13.     //----------------------------------------------Режим загрузки файла---------------------------------------
    14.         $uploadfile = $uploaddir . basename($file_name);
    15.         if (move_uploaded_file($file_tmp, $uploadfile)) {
    16.             $file_umpload = $file_name;
    17.         }else{
    18.             $file_umpload = 2; // процесс не выполнился
    19.         }
    20.     //----------------------------------------------Режим загрузки файла---------------------------------------
    21.     }else{
    22.         $file_umpload = 'Загрузка файлов на сервер отключена!';
    23.     }//1
    24.    
    25.     return $file_umpload;
    26.     }
    27.     $funkit = file_umploads($_POST['file_umploads']);
    28.     echo base64_encode ($funkit); // возвращаю ответ
    29. }else{}
    Данная функция расположена в отдельном файл я обращаюсь к ней посредством Curl из другого файла и возвращаю в тот же файл:

    Код (Text):
    1.  
    2. <?php
    3.         $json_file = array(
    4.             "file_name"=>$_FILES['filename']['name'],
    5.             "file_tmp"=>$_FILES['filename']['tmp_name'],
    6.             "size"=>$_FILES['filename']['size']
    7.         ); // формирую массив
    8.         $param_json = base64_encode(json_encode($json_file)); // формирую json строку
    9.        
    10.  
    11.         include("config/curl.php");  // подключаю функцию CURL
    12.         $url = $domen.$katalog.'/config/file.php';  // указываю ссылку к файлу к которому будет обращение
    13.         $post_url = 'file_umploads='.rawurlencode($param_json); // Формирую POST запрос с JSON строкой
    14.         $curla_file = curl_post($url,$post_url); // Возвращаю результат
    15.  
    16.         if(base64_decode($curla_file) == 2){
    17.             $file_name = 'Error [0009]'; // Скрипт вернул ошибку
    18.         }else{
    19.             $file_name = base64_decode($curla_file); // скрипт вернул имя файла
    20.         }
    21.  
    22.         echo $file_name // вывожу ответ
    23. ?>
    24.  
    25. <form method="post" enctype="multipart/form-data" >
    26. <input type="file" name="filename" >
    27. <input  type="submit" name="send_btn" value="Отправить" >
    28. </form>
    в процессе поиска ошибки выявил что все данные передаются к функции отлично и имя файла и
    и временное расположение и т.д установил что функция move_uploaded_file возвращает FALSE но почему не пойму все верно и данные доходят . Может кто то уже с этим сталкивался ?
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.333
    Симпатии:
    1.753
    проверь права на запись в папку, куда файл пихаешь
     
  3. Webster31

    Webster31 Новичок

    С нами с:
    16 авг 2016
    Сообщения:
    43
    Симпатии:
    0
    Делаю пока на локалке Open server рутовские права разве может конфликт из за этого
     
  4. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.129
    Симпатии:
    1.225
    Адрес:
    там-сям
    очень вероятно, что проблема с пунктом назначения. например ты предполагаешь, что путь отсчитывается относительно одной папки, а реально текущей директорией является совсем другая. попробуй использовать __DIR__ чтобы превратить путь в абсолютный.
     
  5. Webster31

    Webster31 Новичок

    С нами с:
    16 авг 2016
    Сообщения:
    43
    Симпатии:
    0
    да похоже но константа не решила проблему . как указать полный путь а не относительный может это поможет
    Код (Text):
    1. $uploadfile = 'тут относительный путь' . basename($file_name);
    2.         if (move_uploaded_file($file_tmp, $uploadfile)) {
    3.             $file_umpload = $file_name;
    4.         }else{
    5.             $file_umpload = 2; // если параметр вернул два то процесс запишется в логи
    6.         }
     
  6. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.129
    Симпатии:
    1.225
    Адрес:
    там-сям
    а ты вообще применял __DIR__ ? я не вижу её в твоём примере. это не типа какая-то константа, это служебное слово php.
     
  7. Emilien

    Emilien Активный пользователь

    С нами с:
    30 июн 2016
    Сообщения:
    246
    Симпатии:
    156
    Вызов move_uploaded_file находится в 'config/file.php'.
    Только почему же тут не include 'config/file.php', а создаётся новый запрос к веб-серверу?
    PHP:
    1. $url = $domen.$katalog.'/config/file.php';  // указываю ссылку к файлу к которому будет обращение
    2.  
    3. $post_url = 'file_umploads='.rawurlencode($param_json); // Формирую POST запрос с JSON строкой
    4.  
    5. $curla_file = curl_post($url,$post_url); // Возвращаю результат
    Т.е. загрузка файла произошла в контексте одного запроса, а функция move_uploaded_file вызывается в контексте другого веб-запроса запроса.
     
  8. Webster31

    Webster31 Новичок

    С нами с:
    16 авг 2016
    Сообщения:
    43
    Симпатии:
    0
    Did я испытывал, и скрипт переписал через инклюд результат таков , scripts. php=>[INCLUDE]=> config/file.php работает а scripts.php=>[POST]=>config/obrabotchic.php=>[INCLUDE]=>file.php не работает, данные доходят в обоих случаях
     
  9. Webster31

    Webster31 Новичок

    С нами с:
    16 авг 2016
    Сообщения:
    43
    Симпатии:
    0
    Какого типа должна быть ссылка на путь для загрузки файла ? например полный путь сайта: http://site.ru/file/ или локальная: C://webserver/home/site/file и какого типа слеши такой: / или обратный \ ? Константа __DIR__ возвращает локальный путь с обратными слешами
     
  10. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.129
    Симпатии:
    1.225
    Адрес:
    там-сям
    просто используй её. она там к месту.
     
  11. Webster31

    Webster31 Новичок

    С нами с:
    16 авг 2016
    Сообщения:
    43
    Симпатии:
    0
    хорошо но ее использование проблемы не решает вот набросал подробную схему возможно тут будет понятнее
     

    Вложения:

    • api_file.png
      api_file.png
      Размер файла:
      161,4 КБ
      Просмотров:
      5
  12. Webster31

    Webster31 Новичок

    С нами с:
    16 авг 2016
    Сообщения:
    43
    Симпатии:
    0
    начинаю немного разбираться понял что функция is_uploaded_file не находит временного файла хотя он есть в чем проблема может быть ?
     
  13. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.129
    Симпатии:
    1.225
    Адрес:
    там-сям
    телепатов здесь нет. ты даже не показал как ты её вызываешь.
    98% вероятность причина опять в том, что путь указан неверно (не та переменная).
    1%, что ты вызываешь её когда не нужно,
    1%, что ты её не вызываешь

    phpfaq.ru/debug
     
  14. Webster31

    Webster31 Новичок

    С нами с:
    16 авг 2016
    Сообщения:
    43
    Симпатии:
    0
    artoodetoo взгляни на схему выше там все есть и метод вызова в том числе
     
  15. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.129
    Симпатии:
    1.225
    Адрес:
    там-сям
    я взглянул: is_uploaded_file там не упомянается. взглянуть ещё раз? только это будет последний раз, ок? )))
    --- Добавлено ---
    дебаг, приятель. только дебаг!
     
  16. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.333
    Симпатии:
    1.753
    временно загруженные файлы живут очень недолго. В пределах одного этого же запроса.
     
  17. Webster31

    Webster31 Новичок

    С нами с:
    16 авг 2016
    Сообщения:
    43
    Симпатии:
    0
    да я понял в чем проблема тему можно закрывать , при передачи данных после обработчика временный файл стирается, буду думать что нибуть другое . Всем спасибо!
     
  18. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.333
    Симпатии:
    1.753
    а тут не надо думать ничего. Нужно делать в том же месте, где файл пришел. Че тут думать-то ещё.
     
  19. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.129
    Симпатии:
    1.225
    Адрес:
    там-сям
    Сценарий успеха:

    Файл сразу проверяем на что нужно, если норм — копируем и возвращаем в ответе id загруженного файла. Если не норм — возвращаем признак неудачи. Полученный id будет использован в обработчике формы чтобы привязать файл к сообщению.

    Если форма в целом по каким-то причинам так и не была опубликована, файл или файлы останутся "сиротами". Для их удаления время от времени должен запускаться отдельный "сборщик мусора".
     
  20. Webster31

    Webster31 Новичок

    С нами с:
    16 авг 2016
    Сообщения:
    43
    Симпатии:
    0
    artoodetoo да с этим решил вопрос , а как устроен подобный сборщик ? ( у меня хостинг нет возможности cron )
     
  21. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.129
    Симпатии:
    1.225
    Адрес:
    там-сям
    вариант1. ты знаешь как запускается сборщик мусора для сессионных файлов?
    при старте сессии или при shutdown с определенной вероятностью запускается сборщик, который удаляет из определенной папки файлы старше определенного времени. вместо слово "определенный" подставляются настраиваемые параметры ))) [ в дебиан этот порядок изменён ]
    сделай по аналогии.

    вариант 2. найди внешний сервис с "кроном", который будет обращаться к нужному веб-адресу, запускающему сборщик мусора.
    --- Добавлено ---
    Материалы для чтения:
    http://stackoverflow.com/a/1270960/272885
    https://github.com/mtdowling/cron-expression
    https://www.smashingmagazine.com/2013/10/schedule-events-using-wordpress-cron/
    https://www.easycron.com/
    дальше давай сам
     
  22. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.213
    Симпатии:
    1.711
    Адрес:
    Молдова, г.Кишинёв
    почитай про webcron службы, может тебе подойдёт, один минус, что это не запуск через cli, значит есть ограничения по времени
     
    Webster31 нравится это.
  23. Webster31

    Webster31 Новичок

    С нами с:
    16 авг 2016
    Сообщения:
    43
    Симпатии:
    0
    Понял, всем спасибо дальше сам буду разбираться!
     
  24. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.213
    Симпатии:
    1.711
    Адрес:
    Молдова, г.Кишинёв
    Ставь всем лайки