Всем привет ! Возник очень интересный вопрос над которым я ломаю голову уже 2 дня есть функция которая заливает на сервер файлы : Код (Text): if(isset($_POST['file_umploads'])){ function file_umploads($file_gggh){ global $filezipe; //Разрешаю загрузку $json_fi = json_decode(base64_decode(rawurldecode($file_gggh))); $file_name = $json_fi->file_name; // Имя файла $file_tmp = $json_fi->file_tmp; // Временное хранилище $file_size = $json_fi->size; // Размер файла $uploaddir = "file/"; // директория if($filezipe == 1){ //1 //----------------------------------------------Режим загрузки файла--------------------------------------- $uploadfile = $uploaddir . basename($file_name); if (move_uploaded_file($file_tmp, $uploadfile)) { $file_umpload = $file_name; }else{ $file_umpload = 2; // процесс не выполнился } //----------------------------------------------Режим загрузки файла--------------------------------------- }else{ $file_umpload = 'Загрузка файлов на сервер отключена!'; }//1 return $file_umpload; } $funkit = file_umploads($_POST['file_umploads']); echo base64_encode ($funkit); // возвращаю ответ }else{} Данная функция расположена в отдельном файл я обращаюсь к ней посредством Curl из другого файла и возвращаю в тот же файл: Код (Text): <?php $json_file = array( "file_name"=>$_FILES['filename']['name'], "file_tmp"=>$_FILES['filename']['tmp_name'], "size"=>$_FILES['filename']['size'] ); // формирую массив $param_json = base64_encode(json_encode($json_file)); // формирую json строку include("config/curl.php"); // подключаю функцию CURL $url = $domen.$katalog.'/config/file.php'; // указываю ссылку к файлу к которому будет обращение $post_url = 'file_umploads='.rawurlencode($param_json); // Формирую POST запрос с JSON строкой $curla_file = curl_post($url,$post_url); // Возвращаю результат if(base64_decode($curla_file) == 2){ $file_name = 'Error [0009]'; // Скрипт вернул ошибку }else{ $file_name = base64_decode($curla_file); // скрипт вернул имя файла } echo $file_name // вывожу ответ ?> <form method="post" enctype="multipart/form-data" > <input type="file" name="filename" > <input type="submit" name="send_btn" value="Отправить" > </form> в процессе поиска ошибки выявил что все данные передаются к функции отлично и имя файла и и временное расположение и т.д установил что функция move_uploaded_file возвращает FALSE но почему не пойму все верно и данные доходят . Может кто то уже с этим сталкивался ?
очень вероятно, что проблема с пунктом назначения. например ты предполагаешь, что путь отсчитывается относительно одной папки, а реально текущей директорией является совсем другая. попробуй использовать __DIR__ чтобы превратить путь в абсолютный.
да похоже но константа не решила проблему . как указать полный путь а не относительный может это поможет Код (Text): $uploadfile = 'тут относительный путь' . basename($file_name); if (move_uploaded_file($file_tmp, $uploadfile)) { $file_umpload = $file_name; }else{ $file_umpload = 2; // если параметр вернул два то процесс запишется в логи }
а ты вообще применял __DIR__ ? я не вижу её в твоём примере. это не типа какая-то константа, это служебное слово php.
Вызов move_uploaded_file находится в 'config/file.php'. Только почему же тут не include 'config/file.php', а создаётся новый запрос к веб-серверу? PHP: $url = $domen.$katalog.'/config/file.php'; // указываю ссылку к файлу к которому будет обращение $post_url = 'file_umploads='.rawurlencode($param_json); // Формирую POST запрос с JSON строкой $curla_file = curl_post($url,$post_url); // Возвращаю результат Т.е. загрузка файла произошла в контексте одного запроса, а функция move_uploaded_file вызывается в контексте другого веб-запроса запроса.
Did я испытывал, и скрипт переписал через инклюд результат таков , scripts. php=>[INCLUDE]=> config/file.php работает а scripts.php=>[POST]=>config/obrabotchic.php=>[INCLUDE]=>file.php не работает, данные доходят в обоих случаях
Какого типа должна быть ссылка на путь для загрузки файла ? например полный путь сайта: http://site.ru/file/ или локальная: C://webserver/home/site/file и какого типа слеши такой: / или обратный \ ? Константа __DIR__ возвращает локальный путь с обратными слешами
хорошо но ее использование проблемы не решает вот набросал подробную схему возможно тут будет понятнее
начинаю немного разбираться понял что функция is_uploaded_file не находит временного файла хотя он есть в чем проблема может быть ?
телепатов здесь нет. ты даже не показал как ты её вызываешь. 98% вероятность причина опять в том, что путь указан неверно (не та переменная). 1%, что ты вызываешь её когда не нужно, 1%, что ты её не вызываешь phpfaq.ru/debug
я взглянул: is_uploaded_file там не упомянается. взглянуть ещё раз? только это будет последний раз, ок? ))) --- Добавлено --- дебаг, приятель. только дебаг!
да я понял в чем проблема тему можно закрывать , при передачи данных после обработчика временный файл стирается, буду думать что нибуть другое . Всем спасибо!
Сценарий успеха: Файл сразу проверяем на что нужно, если норм — копируем и возвращаем в ответе id загруженного файла. Если не норм — возвращаем признак неудачи. Полученный id будет использован в обработчике формы чтобы привязать файл к сообщению. Если форма в целом по каким-то причинам так и не была опубликована, файл или файлы останутся "сиротами". Для их удаления время от времени должен запускаться отдельный "сборщик мусора".
artoodetoo да с этим решил вопрос , а как устроен подобный сборщик ? ( у меня хостинг нет возможности cron )
вариант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/ дальше давай сам
почитай про webcron службы, может тебе подойдёт, один минус, что это не запуск через cli, значит есть ограничения по времени